1

これは昨日投稿しました。Point.h私は を使用しているので、 とPoint.cppファイルが必要だと人々は提案しtemplateました。クラス用に別のファイルを作成しましたが、Pointまだエラーが発生します。

//Point.h
Point(T = 0, T = 0, string = "Deafault Point");
~Point();
T operator-(const Point<T> &);  

//Point.cpp
template < typename T >
Point<T>::Point(T x,T y, string name)
:X(x), Y(y), Name(name)
{
}

template < typename T >
Point<T>::~Point()
{
}

template < typename T>
T Point<T>::operator-(const Point<T> &rhs)
{
cout << "\nThe distance between " << getName() << " and " 
<< rhs.getName() << " = ";

return sqrt(pow(rhs.getX() - getX(), 2) + pow(rhs.getY() - getY(), 2));;
}

//main.cpp
#include <iostream>
#include <math.h>
#include "Point.h"

using namespace std;

int main () {

Point<double> P1(3.0, 4.1, "Point 1");
cout << P1;

Point<double> P2(6.4, 2.9, "Point 2");
cout << P2;

cout << (P2 - P1);
return EXIT_SUCCESS;
}

これは私が得たものです:

Undefined symbols:
"std::basic_ostream<char, std::char_traits<char> >& operator<< <double (std::basic_ostream<char,  std::char_traits<char> >&, Point<double> const&)", referenced from:
  _main in main.o
  _main in main.o
"Point<double>::operator-(Point<double> const&)", referenced from:
  _main in main.o
"Point<double>::Point(double, double, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)", referenced from:
  _main in main.o
  _main in main.o
"Point<double>::~Point()", referenced from:
  _main in main.o
  _main in main.o
  _main in main.o
  _main in main.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

どんな助けでも大歓迎です...

4

2 に答える 2

7

テンプレートを使用しているため、Point.h および Point.cpp ファイルが必要であると人々は提案しました。

これを提案した人は誰でも完全に間違っています。テンプレートの実装は可視でなければなりません。

実装をファイルに分割できますが、後でそれも含める必要があります。テンプレートの実装を隠すことができる唯一の状況は、特殊化を知っていて事前に宣言している場合です。(ここでは当てはまりません)

テンプレート用に 1 つのファイルが必要です。

//Point.h

template <typename T>
struct Point
{
   Point(T = 0, T = 0, string = "Deafault Point");
   ~Point();
   T operator-(const Point<T> &);  
};

template < typename T >
Point<T>::Point(T x,T y, string name)
:X(x), Y(y), Name(name)
{
}

template < typename T >
Point<T>::~Point()
{
}

template < typename T>
T Point<T>::operator-(const Point<T> &rhs)
{
cout << "\nThe distance between " << getName() << " and " 
<< rhs.getName() << " = ";

return sqrt(pow(rhs.getX() - getX(), 2) + pow(rhs.getY() - getY(), 2));;
}

また、ヘッダーのネイキッドstringは、ヘッダーにも があることを示唆していusing namespace std;ます。これは悪い習慣です。usingディレクティブを削除して name を修飾してstd::stringください。

于 2012-07-25T01:20:29.100 に答える
0

テンプレートクラスに関して定義および実現されたすべてのコードは、「。h」ファイルに書き込む必要があります。そうしないと、コンパイルエラーになります。

于 2012-07-25T01:25:04.537 に答える