1

我对之前的一篇文章有​​一些很好的了解,但我不知道这些编译错误意味着我可以使用一些助手。模板、朋友和重载都是新的,所以 3 in 1 给我带来了一些问题......

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

点.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

点.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;
}

主文件

#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;
    }
4

2 回答 2

5

对于大多数编译器,您需要将模板放在标头中,以便使用它们的编译器可以看到它们。如果您真的想避免这种情况,您可以在必要的类型上使用模板的显式实例化,但将它们放在标题中更为常见。

于 2010-06-03T21:48:31.123 回答
0

Point 类是否与 main 函数在同一个项目中定义和编译?由于模板是在编译时解析的,因此您无法在第二个项目(例如静态库)中定义模板并对其进行链接。如果你想在一个单独的项目中使用它,你需要在头文件中提供完整的实现,并简单地省略模板的源文件。包含该标头后,当编译具有您的 main 函数的文件时,将针对其实际实例化模板进行编译,在您的情况下为 Point 和 Point。

请记住,这确实需要任何链接才能使用该类,并且仅由模板头组成的项目无论如何都不会产生可链接的库。

于 2010-06-03T23:52:34.673 回答