为什么在 header 上的结构中声明的模板不违反 ODR 而特化会违反?
Why templates declared in the struct on the header dont violate ODR and specialization does?
我有这个代码:
#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 内联将合并翻译 table 避免冲突。
但是,为什么我不需要在结构 A 内的 isImplemented 上进行内联?
也许这个问题可以扩展到,为什么如果方法在 header 上的 struct/class 内声明它不需要内联?
据我了解,它会在调用的每个 object 文件 (.o) 上创建符号,这违反了 ODR,为什么不会发生这种情况?
您不需要它有两个原因:
- 在 class 的定义中定义的每个函数都是隐式的
inline
。
- 模板不需要
inline
关键字。请记住,您的原始功能是模板,而特化不是。
这里要强调的一点是template<typename T> bool isImplemented()
不是函数。
它是函数的模板,只有在专门化后才会存在(作为代码),就像您对 template<> inline bool A::isImplemented<int>()
.
所做的那样
这里的inline
不是必须的。没有它程序编译和运行完美。
奇怪的是,您的 struct A
不依赖于任何模板参数,也不依赖于 isImplemented()
方法,所以我仍在努力弄清楚您的意图。
函数的简单用法可能如下所示:
int main( )
{
A a;
a.isImplemented< int >( );
a.isImplemented< double >( );
}
并且输出:
int Implemented
Not Implemented
基本上,您可以分辨出您明确实现了哪些专业化,哪些是通用的。是你需要的吗?
编辑:
鉴于对我的回答的评论,我相信原始问题在这里得到了很好的回答:
- Explicit specialization in non-namespace scope
- C++ syntax for explicit specialization of a template function in a template class?
我有这个代码:
#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 内联将合并翻译 table 避免冲突。
但是,为什么我不需要在结构 A 内的 isImplemented 上进行内联? 也许这个问题可以扩展到,为什么如果方法在 header 上的 struct/class 内声明它不需要内联? 据我了解,它会在调用的每个 object 文件 (.o) 上创建符号,这违反了 ODR,为什么不会发生这种情况?
您不需要它有两个原因:
- 在 class 的定义中定义的每个函数都是隐式的
inline
。 - 模板不需要
inline
关键字。请记住,您的原始功能是模板,而特化不是。
这里要强调的一点是template<typename T> bool isImplemented()
不是函数。
它是函数的模板,只有在专门化后才会存在(作为代码),就像您对 template<> inline bool A::isImplemented<int>()
.
这里的inline
不是必须的。没有它程序编译和运行完美。
奇怪的是,您的 struct A
不依赖于任何模板参数,也不依赖于 isImplemented()
方法,所以我仍在努力弄清楚您的意图。
函数的简单用法可能如下所示:
int main( )
{
A a;
a.isImplemented< int >( );
a.isImplemented< double >( );
}
并且输出:
int Implemented
Not Implemented
基本上,您可以分辨出您明确实现了哪些专业化,哪些是通用的。是你需要的吗?
编辑:
鉴于对我的回答的评论,我相信原始问题在这里得到了很好的回答:
- Explicit specialization in non-namespace scope
- C++ syntax for explicit specialization of a template function in a template class?