2016-10-01 54 views
1

我已经用模板化方法创建了一个普通类,并且所有方法实例都是显式的和内联的。显式类成员实例化

class MyClass 
{ 
    template<int N> inline void MyMethod(); 
    template<> inline void MyMethod<1>() { cout << 1; } 
    template<> inline void MyMethod<2>() { cout << 2; } 
}; 

我需要使用template<>语法有它编译。我尝试了其他的解决方案,比如类声明之外的方法的显式定义,以及语法变体,都无济于事。 (这是VS2008下进行,而不是试图在以后的版本。)

我有两个问题:

  • 是这种便携式?
  • 它有道理吗?

回答

2

你写的方式是错误的,它不会工作。
会员法特必须把你的类:

class MyClass 
{ 
    template<int N> void MyMethod(); 
}; 

template<> void MyClass::MyMethod<1>() { } 
template<> void MyClass::MyMethod<2>() { } 

它的便携和是否有意义主要取决于你的实际问题,很难从你的例子说。

+0

值得注意的是,可以将这些模板方法的特化的实现(只要标题包含这些特化的适当声明)移动到源文件。虽然它不能用未被专门化的方法模板来完成...... –

+0

为什么它能够工作呢? –

+0

@ YvesDaoust其实它[不](https://godbolt.org/g/yEBYVo)[工作](https://godbolt.org/g/GzWrlo)。也许你的编译器的扩展? – skypjack

1

你不能完全专注于类体中的成员模板。部分专业化是允许的。必须在课堂主体之外声明/定义完全专业化(如果未声明inline,应将定义放在cpp文件中)。

作为参考,这个question

+0

而且由于不能部分地专门化方法(它在语法上被禁止) - 在类内不能定义任何方法专门化...但是我不确定是否严格要求定义应该在源文件中,我认为它是相当一个选项,虽然它不是非专业方法模板的选项... –

+0

很抱歉,我没有提及内联 –