簡體   English   中英

cpp文件中的模板專業化實現導致template-id不匹配錯誤

[英]Template specialization implementation in cpp file causes template-id does not match error

考慮以下代碼:

class Bar;

enum Values
{
  ValA,
  ValB, // ...
};

template< typename T >
struct Foo : virtual public Bar
{
};

template<>
struct Foo< ValA >
{
  void doSomething();
};

如果我在頭文件中定義了doSomething()的實現,那么當我使用Foo::doSomething()時,程序不會抱怨。 但是,如果將實現按如下所示移動到cpp文件,則會收到錯誤消息:

template<>
void Foo< ValA >::doSomething()
{
  // ...
}

錯誤:

error: template-id 'doSomething<>' for 'void Foo<(Values)0u>::doSomething()' does not match any template declaration.

我不確定為什么會失敗。 我認為,將專用實現移至cpp文件應該不是問題。 我以前做過

有幾個問題。

@dyp在您的問題的評論部分中指出了一個。 您需要使用:

void Foo< ValA >::doSomething()
{
}

代替

template<>
void Foo< ValA >::doSomething()
{
}

另一個是您必須將類模板更改為:

template< int T >
struct Foo : virtual public Bar
{
};

如果使用typename作為模板參數,則不能使用ValA創建Foo的專業化版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM