c++ - 使用模板类c ++的朋友函数
问题描述
我创建了一个具有友元函数的类,当我声明它时没有问题,但是当我编写它的代码时它返回错误:
“'change' 的离线定义与 'MyClass' 中的任何声明都不匹配”。
这是代码
template <class T>
class MyClass {
private:
T a;
public:
MyClass(T);
~MyClass();
friend void change(MyClass);
};
template <class T>
MyClass <T> :: MyClass(T value) {
a = value;
}
template <class T>
MyClass <T> :: ~MyClass() {}
template <class T>
void MyClass <T> :: change(MyClass class) { //Out-of-line definition of 'change' does not match any declaration in 'MyClass <T>'
a = class.a;
}
解决方案
friend void change(MyClass);
不声明 的成员函数MyClass
,它是编译器授予自由函数¹ void change(MyClass);
访问 的私有/受保护成员的指令MyClass
。
您授予访问权限的免费功能MyClass
必须是这样的:
template <class S>
void change(MyClass<S> obj) {
obj.a; // obj.a can be accessed by the free function
}
但是friend
then 必须在类中以这种方式声明:
template <class T>
class MyClass {
private:
T a;
public:
MyClass(T);
~MyClass();
template <class S>
friend void change(MyClass<S>);
};
但基于我认为你a = class.a
实际上change
想要这个:
template <class T>
class MyClass {
private:
T a;
public:
MyClass(T);
~MyClass();
void change(MyClass);
};
template <class T>
MyClass <T> :: MyClass(T value) {
a = value;
}
template <class T>
MyClass <T> :: ~MyClass() {}
template <class T>
void MyClass <T>::change(MyClass class) {
a = class.a;
}
的成员函数MyClass
始终可以访问 的任何实例的所有成员MyClass
。
推荐阅读
- android - Android JSON解析JSONArray
- ruby-on-rails - 在 Rails 视图中渲染内联背景图像时转义路径/url
- visual-studio-code - 激活 TreeViewItem 上的命令单击,VSCode 扩展
- java - 一旦调用了 driver.get(URL) 方法,Selenium Java Client 就不会取回控制权
- python - 我无法理解 Tkinter 中的一些 find_text 函数
- firebase - 在 firebase 云功能中使用 web3 连接到 infura 失败
- hadoop - 您如何获得特定蜂巢作业的设置列表?
- reactjs - 做出反应。为什么当我在请求后请求 api 时会在我调用的浏览器 url 中出现 api
- html - 如何将多行按钮与其中的不同文本对齐?
- list - Cassandra 将值从文本迁移到文本列表