doc*_*doc 13 c++ virtual templates inline
可以在其体外定义类模板的虚函数吗?虚函数不能内联,但为了避免编译单元中的多个定义,应标记它们inline
(假设模板头将包含在多个源文件中).另一方面,编译器可以自由忽略inline
,因此这似乎是有效的.举个例子,下面的代码是正确的:
template <typename T>
class C
{
public:
virtual void f(T val);
};
template <typename T>
inline
void C<T>::f(T val)
{
//definition
}
Run Code Online (Sandbox Code Playgroud)
?
BTW gcc(3.4.2)允许inline
在定义函数f(T val)
之前省略,但不能在常规类的类似函数之前省略.这只是gcc的行为吗?
jpa*_*cek 11
是的,即使没有也没关系inline
.它对普通成员函数和静态变量的作用相同:
// everything in the header:
template <class T>
class A
{
static int i;
};
template <class T>
int A<T>::i=0;
Run Code Online (Sandbox Code Playgroud)
标准报价:(3.2/5)
类类型(第9条),枚举类型(7.2),带有外部链接的内联函数(7.1.2),类模板(第14条),非静态函数模板(14.5.6)可以有多个定义,类模板的静态数据成员(14.5.1.3),类模板的成员函数(14.5.1.1),或模板特化,在程序中没有指定某些模板参数(14.7,14.5.5)定义出现在不同的翻译单元中,并且定义满足以下要求......
要求基本上说两个定义必须相同.
它不适用于常规课程.整个计划中最多只能有一个定义.
您可以class
在同一标头中定义定义之外的模板方法,而无需使用inline
和不使用多个定义错误.
这是因为模板函数本身并不生成定义,如果它不是完全专门化的.为了证明我的观点,以下内容:
void C<int>::f(int)
{
}
Run Code Online (Sandbox Code Playgroud)
将导致链接器错误,因为在这种情况下该函数具有定义.(如果您将其包含在多个翻译单元中.如果您将其标记为内联:
inline void C<int>::f(int)
{
}
Run Code Online (Sandbox Code Playgroud)
错误不再发生.