我一直在尝试创建一个类笛卡尔,其中对象是笛卡尔点上的2个点(int或double)。然后我想重载<<。我收到错误消息:
Undefined symbols for architecture x86_64:
"cartesian<double, int>::cartesian(double, int)", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我不明白我的错误在哪里。
THE HEADER
#include <iostream>
using namespace std;
template <class first, class second>
class cartesian
{
public:
cartesian(first, second);
//double getslope(cartesian &obj1, cartesian &obj2);
friend ostream& operator<< (ostream &out, cartesian &cPoint);
private:
first x;
second y;
};
CPP文件
#include "cartesian.h"
#include <iostream>
using namespace std;
template<class first,class second>
cartesian<first, second>::cartesian(first a, second b)
:x(a), y(b)
{}
/*
// between obj1 and obj2
template<class first,class second>
double cartesian<first, second>::getslope(cartesian &obj1, cartesian &obj2){
return ((obj2.y-obj1.y)/(obj2.x-obj1.y));
}
*/
template<class first,class second>
ostream& operator<< (ostream &out,const cartesian<first, second> &cPoint)
{
// Since operator<< is a friend of the Point class, we can access
// Point's members directly.
out << "(" << cPoint.x << ", " <<
cPoint.y << ")";
return out;
}
主要
#include <iostream>
#include "cartesian.h"
using namespace std;
int main()
{
cartesian<double, int> ob11(3.4, 6);
return 0;
}
答案 0 :(得分:3)
您需要将实现放在头文件或标头包含的文件中。编译器需要访问代码才能在cartesian<double, int>
中“构建”您需要的main
专业化。
例如,这里我们将构造函数的实现放在类声明中:
template <class first, class second>
class cartesian
{
public:
cartesian(first, second) :x(a), y(b) {}
};
它不必进入类声明本身,但必须可以从头文件中访问代码。