我是否宣布部分专业的朋友课?- 非常困惑

Ian*_*rty 5 c++ templates

我现在已经用太多时间在这一个上翻阅我的拇指了.我正在尝试使用两个不同的分配器为节点和它们指向的类型实现单个链表.下面的代码一直抱怨我,我在SingleListNode定义中部分地专门化了友元类声明:

namespace containers {
template<typename T, typename TAlloc,
typename NAlloc>class SingleList; // forward declaration

template<typename T, typename TAlloc = std::allocator<T>>
class SingleListNode {
    template<typename T1, typename T2, typename T3>
    friend class SingleList<T1, T2, T3> ; // partially specialized???
    // class definition
};

template<typename T, typename TAlloc = std::allocator<T>,
        typename NAlloc = std::allocator<SingleListNode<T>>>
class SingleList {
    // class definition
};
} // end of namespace containers
Run Code Online (Sandbox Code Playgroud)

继续告诉我:

../src/singlelist.h:21:16:错误:'模板结构容器:: SingleList'的特化必须出现在命名空间范围../src/singlelist.h:21:39:错误:部分特化'容器: :SingleList'声明'朋友'

据我所知,这不是专业化.也许这是GCC编译器中的一个错误?否则,我哪里错了?

bbt*_*trb 9

您正在声明一个模板化的朋友类,所以正确的语法是

 template<typename T1, typename T2, typename T3> 
 friend class SingleList;
Run Code Online (Sandbox Code Playgroud)

例如,请参见此处的"实际使用示例"