gpt4 book ai didi

c++ Friend函数不被识别为具有模板特化的 friend

转载 作者:行者123 更新时间:2023-12-05 01:49:14 24 4
gpt4 key购买 nike

我正在尝试将函数声明为具有 protected 成员的类模板的友元。下面是一个最小的例子。

template<int N> class myClass{
public:
friend void f(const myClass& c);
protected:
int a;
};

如果我现在将函数定义为

template<int N> void f(const myClass<N>& c){
std::cout << c.a;
};

然后就可以了。

但是如果我使用模板特化

template<int N> void f(const myClass<N>& c);
template<> void f<1>(const myClass<1>& c){
std::cout << c.a;
};

它不再将f 识别为 friend ,并提示a 是 protected 成员。

为什么会这样?我做错了什么?

最佳答案

问题在于友元声明 friend void f(const myClass& c); 是一个非模板友元声明。也就是说,您实际上是在与非模板自由函数交 friend 。这正是警告告诉您的内容:

 warning: friend declaration 'void f(const myClass<N>&)' declares a non-template function [-Wnon-template-friend]
12 | friend void f(const myClass& c);

解决这个问题,您需要为 friend 声明添加一个单独的参数子句,如下所示:

template<int N> class myClass{
public:
template<int M> //added this parameter clause
friend void f(const myClass<M>& c);
protected:
int a;
};

Working demo

关于c++ Friend函数不被识别为具有模板特化的 friend ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74345380/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com