我对之前的帖子有一些很好的见解,但是我不知道这些编译错误意味着我可以使用一些助手。模板,朋友和重载都是新的,所以三合一会给我一些问题......
1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall Point<double>::Point<double>(double,double)" (??0?$Point@N@@QAE@NN@Z) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall Point<int>::Point<int>(int,int)" (??0?$Point@H@@QAE@HH@Z) referenced in function _main
1>C3_HW8.exe : fatal error LNK1120: 3 unresolved externals
Point.h
#ifndef POINT_H
#define POINT_H
#include <iostream>
template <class T>
class Point
{
public:
Point();
Point(T xCoordinate, T yCoordinate);
template <class G>
friend std::ostream &operator<<(std::ostream &out, const Point<G> &aPoint);
private:
T xCoordinate;
T yCoordinate;
};
#endif
Point.cpp
#include "Point.h"
template <class T>
Point<T>::Point() : xCoordinate(0), yCoordinate(0)
{}
template <class T>
Point<T>::Point(T xCoordinate, T yCoordinate) : xCoordinate(xCoordinate), yCoordinate(yCoordinate)
{}
template <class G>
std::ostream &operator<<(std::ostream &out, const Point<G> &aPoint)
{
std::cout << "(" << aPoint.xCoordinate << ", " << aPoint.yCoordinate << ")";
return out;
}
的main.cpp
#include <iostream>
#include "Point.h"
int main()
{
Point<int> i(5, 4);
Point<double> *j = new Point<double> (5.2, 3.3);
std::cout << i << j;
}
答案 0 :(得分:5)
对于大多数编译器,您需要将模板放在标头中,因此编译器可以看到它们的使用位置。如果你真的想避免这种情况,你可以在必要的类型上使用模板的显式实例化,但是将它们放在标题中更为常见。
答案 1 :(得分:0)
Point类是否在与main函数相同的项目中定义和编译?当模板在编译时解析时,您无法在第二个项目中定义模板,例如静态库,并链接到它。如果你想在一个单独的项目中,你需要在标题内提供完整的实现,只需省略模板的源文件。在包含该头文件时,当编译带有main函数的文件时,模板将针对其实际实例进行编译,在您的情况下为Point和Point。
请记住,这需要任何链接才能使用该类,并且仅包含模板头的项目无论如何都不会生成可链接的库。