我试图在我的Mac上用clang 3编译下面的the classic copy&swap idiom代码。3
template<typename T> class node{
private:
node<T>* left;
node<T>* right;
T value;
public:
friend void swap(node<T>&, node<T>&);
// other stuff
}
”林书豪抱怨道。我现在明白了我应该将函数声明为模板。但是如果我按照MSDN建议的here风格,就会发生错误:
template <class T> class Array {
T* array;
int size;
public:template<class T>
//...
template <class T>
friend Array<T>* combine(Array<T>& a1, Array<T>& a2);
};
我做了复制粘贴,但得到了以下错误:
te.cpp:33:19: error: declaration of 'T' shadows template parameter
template<class T>
^
te.cpp:4:17: note: template parameter is declared here
template <class T> class Array {
^
1 error generated.
这是叮当虫吗MSDN网站建议它在VC++下工作。
PS:我知道有两种解决方案:在模板类中定义友元函数,如Stackoverflow文章中所述,或在模板类中以以下方式声明:
template <typename U> friend void swap(node<U>&, node<U>&);
但两者都困扰着我。第一个集群类的声明,而第二个赠款友谊交换不同的类型。
更新:第三种解决方案是使用带专门化的前向声明:
template <typename T> class node;
template <typename T> void swap (node<T>&, node<T>&);
template <typename T> class node{
//...
friend void swap<> (node<T>&, node<T>&);
};
这也适用于clang。
2条答案
按热度按时间huwehgph1#
我相信这是你想要的(这恰好是你刚刚作为第三个选项添加到你的问题中的)
ubbxdtey2#
如果你正在创建一个友元函数,你必须在函数声明期间(在类内部)编写
template<class datatype>
。确保使用不同的模板参数名称,例如: