Друзья, шаблоны, перегрузка << ошибки компоновщика - PullRequest
1 голос
/ 04 июня 2010

У меня было хорошее понимание более раннего поста относительно этого, но я понятия не имею, что означают эти ошибки компиляции, что я мог бы использовать некоторый помощник. Шаблоны, друзья и перегрузка все новые, поэтому 3 в 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

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

Ответы [ 2 ]

5 голосов
/ 04 июня 2010

В большинстве компиляторов вам необходимо поместить шаблоны в заголовки, чтобы они были видны компилятору, где они используются. Если вы действительно хотите этого избежать, вы можете использовать явное создание экземпляров шаблона (шаблонов) над необходимыми типами, но размещение их в заголовке встречается гораздо чаще.

0 голосов
/ 04 июня 2010

Определен ли класс Point и скомпилирован в том же проекте, что и основная функция? Поскольку шаблоны разрешаются во время компиляции, вы не можете определить шаблон во втором проекте, например, в статической библиотеке и ссылаться на нее. Если вы хотите сделать это в отдельном проекте, вам нужно предоставить полную реализацию внутри заголовка и просто пропустить исходный файл шаблона. После включения этого заголовка, когда будет скомпилирован файл с вашей основной функцией, шаблон будет скомпилирован для его реальных реализаций, в вашем случае Point and Point.

Имейте в виду, что для того, чтобы использовать этот класс, требуется любое связывание, и проект, состоящий только из заголовков шаблонов, в любом случае не создаст связываемый lib.

...