如果我们有一个标准的类:
class Foo {
public:
int fooVar = 10;
int getFooVar();
}getFooVar()的实现将是:
int Foo::getFooVar() {
return fooVar;
}但在模版类中:
template <class T>
class Bar {
public:
int barVar = 10;
int getBarVar();
}getBarVar()的实现必须是:
template <class T>
int Bar<T>::getBarVar(){
return barVar();
}考虑到函数不使用任何模板变量这一事实,为什么在template <class T>和getBarVar和Bar<T>::的函数实现之前必须有这个行(相对于Bar::)?
发布于 2018-12-03 14:56:24
正如其他答案所述,Bar本身就是一个模板。
但是现在假设您不需要它,毕竟,您指定了它,并且我添加了另一个模板参数:
template<typename T1, typename T2>
class Bar
{
void something();
};为什么:
template<typename T1, typename T2>
void Bar<T1, T2>::something(){}而不是:
void Bar::something(){}如果您想为一种类型的T1而不是另一种类型的实现专门化您的实现,会发生什么?你需要添加这些信息。这就是这个template声明发挥作用的地方,也是为什么通用实现(IMHO)也需要它的原因。
template<typename T>
void Bar<T, int>::something(){}发布于 2018-12-03 14:47:57
您需要它,因为Bar不是一个类,而是一个模板。Bar<T>是这门课。
发布于 2018-12-03 14:46:23
当您实例化类时,编译器将检查是否存在实现。但在编写代码时,不知道最终类型(即实例化类型)。
因此,编译器为您实例化定义,如果编译器应该实例化某些内容,则需要对其进行模板化。
https://stackoverflow.com/questions/53596083
复制相似问题