Clang VS VC++:“错误:'T'阴影模板参数的声明”

kokeuurv  于 2023-05-02  发布在  其他
关注(0)|答案(2)|浏览(129)

我试图在我的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。

huwehgph

huwehgph1#

我相信这是你想要的(这恰好是你刚刚作为第三个选项添加到你的问题中的)

#include <utility>

template <typename T> class node;
template <typename T> void swap(node<T> & a, node<T> & b);

template<typename T> class node {
    private:
        node<T>* left;
        node<T>* right;
        T value;

    public:
        friend void swap<>(node<T>&, node<T>&);
};

template <typename T> void swap(node<T> & a, node<T> & b) {
    std::swap(a.left, b.left);
    std::swap(a.right, b.right);
    std::swap(a.value, b.value);
}

int main() {
    node<int> x, y;
    swap(x, y);
}
ubbxdtey

ubbxdtey2#

如果你正在创建一个友元函数,你必须在函数声明期间(在类内部)编写template<class datatype>。确保使用不同的模板参数名称,例如:

template <class t>
class Algebra
{
    t a, b;

public:

template<typename os>
friend istream& operator>>( istream & input, Algebra<os>&obj);

};

相关问题