假设头文件myheader.hxx
定义了一个类模板A
,其中定义了非模板化的类B
(不依赖于A
的模板参数):
template<class T>
class A {
class B {
// ...
};
};
在这种情况下,在B
中实现myheader.hxx
是否可以,或者我是否需要编写单独的myheader.cxx
以避免在链接时重复定义?这种情况是不是由不同的编译器持续处理?
答案 0 :(得分:0)
它仍然是模板(或模板的一部分,不知道超精确的定义),即使它不是顶级模板,所以你需要应该在标题(从技术上讲,它可以在源文件中,如果它是唯一使用它的地方,但这可能会破坏目的)。
注意:如果您不打算使用类定义内联实现其成员函数,则需要以下语法:
template<typename T>
void A<T>::B::foo(...)
{
// ...
}
另外,因为它出现之前,如果B
碰巧有自己的模板参数,那就像是:
template<typename T>
template<typename T2>
void A<T>::B<T2>::foo(...)
{
// ...
}
不
template<typename T, typename T2>
void A<T>::B<T2>::foo(...)
{
// ...
}
如果B
没有,B::foo
没有,那就是:
template<typename T>
template<typename T2>
// void A<T>::B::foo<T2>(...) // not this apparently
void A<T>::B::foo(...)
{
// ...
}
编辑:对于一个函数来说,显然它是foo
而不是foo<T2>
,至少对于GCC(所以几乎100%确定这是标准行为)......我确定一些语言律师能够解释原因:)
等