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

时间:2011-12-07 15:59:43

标签: 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

继续告诉我:

  

../ src / singlelist.h:21:16:错误:'template struct containers :: SingleList'的特化必须出现在命名空间范围内   ../src/singlelist.h:21:39:错误:部分特化'containers :: SingleList'声明'朋友'

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

1 个答案:

答案 0 :(得分:7)

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

 template<typename T1, typename T2, typename T3> 
 friend class SingleList;

<T1, T2, T3>之后没有SingleList。 例如,请参阅“实际使用示例”here