使用模板 类 c++ 的友元函数

friend function using template classes c++

我做了一个 class 它有一个友元函数,当我声明它时没有问题但是,当我写它的代码时它 returns 我的错误:

“'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);访问[=37的指令=] MyClass.

成员

您授予 MyClass 访问权限的免费功能必须是这样的:

template <class S>
void change(MyClass<S> obj) {
    obj.a; // obj.a can be accessed by the free function
}

但是 friend 必须在 class 中以这种方式声明:

template <class T>
class MyClass {
private:
    T a;
    
public:
    MyClass(T);
    ~MyClass();

    template <class S>
    friend void change(MyClass<S>);
};

但基于 change 中的 a = class.a,我认为你实际上想要这个:

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: What is the meaning of the term “free function” in C++?