首页 > 解决方案 > 使用模板类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;
}

标签: c++functiontemplatesfriend

解决方案


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
}

但是friendthen 必须在类中以这种方式声明:

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

1:C++中的“自由函数”一词是什么意思?


推荐阅读