繁体   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