我有以下代码,不能在GCC 4.9和GCC 5.1上编译。我似乎无法弄清楚原因。很抱歉,如果这是一个菜鸟问题,我对C ++模板不熟悉。
template<class T>class A
{
template<class X>friend class B;
struct C {};
};
template<class X>class B
{
template<class T>friend struct A<T>::C;
};
int main()
{
A<int> a;
B<float> b;
}
编译时出现以下错误
root@localhost# g++-49 templatefriend.cpp
templatefriend.cpp: In instantiation of âclass B<float>â:
templatefriend.cpp:38:9: required from here
templatefriend.cpp:27:9: error: âstruct A<T>::Câ is private
struct C {};
^
templatefriend.cpp:31:1: error: within this context
{
^
如果删除模板
,则编译正常class A
{
friend class B;
class C{};
};
class B
{
friend class A::C;
};
int main()
{
A a;
B b;
}
感谢任何帮助,或者如果已经提出过这样的问题,请分享链接。
答案 0 :(得分:2)
在这种情况下你从clang得到的警告更有帮助:
warning: dependent nested name specifier 'A<X>::' for friend class declaration is not supported
换句话说,A :: C是一种依赖类型,所以它不起作用(虽然我不会知道标准在哪里被描述。
我怀疑实际上你只希望关系在A<T>
和B<T>
之间,其中T
是相同的(例如A<int>
和{{1}但不是B<int>
和A<char>
)。如果是这种情况,您可以通过在友元声明中使用相同的模板参数来完成此操作
B<float>
另一种方法是在template <typename T> class B;
template<class T>
class A {
friend class B<T>; // B of the same templated type is my friend
struct C {};
};
template<class T>
class B {
friend struct A<T>::C; // A::C of the same templated type is my friend
};
内加template <typename> class A;
,这样B
也会成为朋友。