假设一个头文件myheader.hxx
定义了一个类模板A
,其中定义了一个非模板类B
(不依赖于模板参数A
):
template<class T>
class A {
class B {
// ...
};
};
在这种情况下可以实现B
in myheader.hxx
,还是我需要单独编写一个myheader.cxx
以避免在链接时重复定义?这种情况是否由不同的编译器一致处理?
假设一个头文件myheader.hxx
定义了一个类模板A
,其中定义了一个非模板类B
(不依赖于模板参数A
):
template<class T>
class A {
class B {
// ...
};
};
在这种情况下可以实现B
in myheader.hxx
,还是我需要单独编写一个myheader.cxx
以避免在链接时重复定义?这种情况是否由不同的编译器一致处理?
即使它不是顶级模板,它仍然是模板(或模板的一部分,不知道超精确的定义),因此您需要在标头中实现它(从技术上讲,它可以在源代码中)文件,如果那是它唯一使用的地方,但这可能会破坏目的)。
注意:如果您不打算在类定义中实现其成员函数,则需要如下语法:
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% 确定这是标准行为)......我相信一些语言律师将能够解释为什么:)
等等。