首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在实现所有模板类方法之前,我们为什么需要'template <class T>‘

在实现所有模板类方法之前,我们为什么需要'template <class T>‘
EN

Stack Overflow用户
提问于 2018-12-03 14:44:18
回答 5查看 909关注 0票数 4

如果我们有一个标准的类:

代码语言:javascript
复制
class Foo {
  public:
    int fooVar = 10;
    int getFooVar();
}

getFooVar()的实现将是:

代码语言:javascript
复制
   int Foo::getFooVar() {
       return fooVar;
   }

但在模版类中:

代码语言:javascript
复制
template <class T>
class Bar {
  public:
    int barVar = 10;
    int getBarVar();
}

getBarVar()的实现必须是:

代码语言:javascript
复制
template <class T>
int Bar<T>::getBarVar(){
   return barVar();
}

考虑到函数不使用任何模板变量这一事实,为什么在template <class T>getBarVarBar<T>::的函数实现之前必须有这个行(相对于Bar::)?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-12-03 14:56:24

正如其他答案所述,Bar本身就是一个模板。

但是现在假设您不需要它,毕竟,您指定了它,并且我添加了另一个模板参数:

代码语言:javascript
复制
template<typename T1, typename T2>
class Bar
{
    void something();
};

为什么:

代码语言:javascript
复制
template<typename T1, typename T2>
void Bar<T1, T2>::something(){}

而不是:

代码语言:javascript
复制
void Bar::something(){}

如果您想为一种类型的T1而不是另一种类型的实现专门化您的实现,会发生什么?你需要添加这些信息。这就是这个template声明发挥作用的地方,也是为什么通用实现(IMHO)也需要它的原因。

代码语言:javascript
复制
template<typename T>
void Bar<T, int>::something(){}
票数 3
EN

Stack Overflow用户

发布于 2018-12-03 14:47:57

您需要它,因为Bar不是一个类,而是一个模板。Bar<T>是这门课。

票数 6
EN

Stack Overflow用户

发布于 2018-12-03 14:46:23

当您实例化类时,编译器将检查是否存在实现。但在编写代码时,不知道最终类型(即实例化类型)。

因此,编译器为您实例化定义,如果编译器应该实例化某些内容,则需要对其进行模板化。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53596083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档