模板嵌套私有类作为朋友

时间:2015-06-17 05:19:07

标签: c++ templates gcc

我有以下代码,不能在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;
}

感谢任何帮助,或者如果已经提出过这样的问题,请分享链接。

1 个答案:

答案 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也会成为朋友。