2

オブジェクトがデカルト ポイント (int または double) 上の 2 つのポイントであるクラスデカルトを作成しようとしています。次に、<< をオーバーロードします。エラーメッセージが表示されます:

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)

私の間違いがどこにあるのかわかりません。

ヘッダー

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

1 に答える 1

4

ヘッダー ファイルまたはヘッダーに含まれるファイルに実装を配置する必要があります。cartesian<double, int>で必要な特殊化を「構築」するために、コンパイラはコードにアクセスする必要がありmainます。

たとえば、ここではコンストラクターの実装をクラス宣言に入れます。

template <class first, class second>
class cartesian
{

public:
    cartesian(first, second) :x(a), y(b) {}
};

クラス宣言自体の内部に入る必要はありませんが、ヘッダー ファイルからコードにアクセスできる必要があります。

于 2012-08-19T17:28:05.667 に答える