在cpp文件中实现模板专门化导致Template -id does not match错误

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

本文关键字:-id Template does not 错误 match 专门化 文件 cpp 实现      更新时间:2023-10-16

考虑以下代码:

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的专门化。