【发布时间】:2017-04-10 13:13:13
【问题描述】:
我有这个代码:
#include <iostream>
struct A
{
template<typename T> bool isImplemented()
{
std::cout << "Not Implemented" << std::endl;
return false;
}
};
template<> inline bool A::isImplemented<int>()
{
std::cout << "int Implemented" << std::endl;
return true;
}
我可以理解为什么模板特化需要内联,为了防止违反ODR,内联会合并翻译表以避免冲突。
但是,为什么我不需要在结构 A 内的 isImplemented 上进行内联? 也许这个问题可以扩展到,为什么如果方法是在标题的结构/类中声明的,它不需要内联? 据我所知,它会在它调用的每个目标文件 (.o) 上创建符号,违反 ODR,为什么不会发生这种情况?
【问题讨论】:
-
任何带有模板参数的东西本质上都是隐含的
inline。 -
模板特化是一个函数。模板就是模板。模板不是函数,反之亦然。模板遵循不同的规则。
-
@KerrekSB 实际上有很大帮助,谢谢。我在试图理解为什么我只需要专业化时遇到问题。我想这与声明友元运算符时应用的规则相同,并且您需要使用 inline 以防止违反 ODR,对吧?
标签: c++ templates one-definition-rule