【问题标题】:Non-template methods of a template class in .cpp file - Undefined reference?.cpp 文件中模板类的非模板方法 - 未定义的引用?
【发布时间】:2016-12-28 17:13:14
【问题描述】:

我知道模板函数必须在头文件中定义,出于某种原因我忘记了。但是我相信非模板函数,即使它们属于模板类,也可以在 .cpp 文件中定义。那是允许的吗?如果不是,为什么不呢?谢谢你:)

【问题讨论】:

  • 嗯,模板类的所有内容都是模板,即使它没有显示在方法签名或方法的代码中;考虑到即使类布局通常也依赖于模板参数(因此模板参数不出现的方法的生成代码可能在不同的模板实例之间有所不同),定义何时允许“挑选”单个方法只需添加更混乱的标准规则。在我看来,将所有模板不变的东西移动到基类的简单解决方案似乎是一个更好的选择。

标签: c++ function class templates


【解决方案1】:

实际上,必须在标头/使用点中定义的内容(除非在其他地方发生显式实例化),是“模板化实体”。到目前为止,C++ 中还没有这样的术语,但正在提议将其添加到语言中,因为许多规则适用于“模板化实体”而不仅仅是模板。

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0391r0.html

原因应该很明显。就像模板一样,模板的成员可以使用模板参数,因此它们的源必须可用于实例化。

为类解决这个问题的技巧(如果成员函数不使用模板参数)是将函数放在非模板基类中并从类模板继承该类。

【讨论】:

  • 感谢您的帮助。所以基本上不可能在 .cpp 中实现一个不使用模板类型的非模板成员函数,不是因为编译器缺少所需的信息,而仅仅是因为 C++ 的限制,对吧?
  • 我认为不仅仅是因为这个。但是因为编译器,在编译cpp文件时无法与模板类mmeber的用户沟通,该函数没有“使用模板参数”并且已经编译。调用站点上的用户需要知道这一点才能以不同的方式调用此函数(即不使用包含模板参数编码等的符号名称)。然后是语言需要说明的规则,何时以及何时不考虑使用参数。使用“this”算不算?
猜你喜欢
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
相关资源
最近更新 更多