头文件.h
template <typename T>
class example {
public:
example() { p = nullptr; };
example(T x, T y, T z) {
p = new Point<T>(x, y, z);
};
~example() { if (p != nullptr) delete p; }
template <typename T>
class Point {
public:
Point(T x, T y, T z) {
this->x = x;
this->y = y;
this->z = z;
}
T x, y, z;
};
void get_point();
friend void set_point(example<T> & ex, T x, T y, T z);
Point<T> * p;
};
template<typename T>
void example<T>::get_point() {
cout << p->x << endl;
cout << p->y << endl;
cout << p->z << endl;
}
template<typename T>
void set_point(example<T> & ex, T x, T y, T z) {
ex.p->x = x;
ex.p->y = y;
ex.p->z = z;
}
主文件
#include <iostream>
#include "header.h"
using namespace std;
int main() {
example<int> ex(12,20,15);
ex.get_point();
set_point(ex,5,25,35);
ex.get_point();
return 0;
}
它编译没有错误,但是当我在没有调试的情况下运行它时,它给出:
错误 LNK2019 在主函数中引用未解析的外部符号“void __cdecl set_point(class example &,int,int,int)”(?set_point@@YAXAEAV?$example@H@@HHH@Z)
并且不启动。为什么?
您需要在定义它的同一类中声明一个友好函数,即 它必须声明为模板,但不能使用与类相同的模板参数,因为它不是类的成员,而只是使用其私有成员和受保护成员的函数:
嵌套类也是如此:
另外,在定义函数(函数体)之后,有分号的语法错误,所以在定义构造函数后删除它们。我没有看到任何其他错误...