0

重複の可能性:
テンプレートをヘッダーファイルにのみ実装できるのはなぜですか?
未定義の参照/未解決の外部シンボルエラーとは何ですか?それを修正するにはどうすればよいですか?

ファイルにテンプレートクラスを定義しました。

point.hは

#ifndef POINT_H
#define POINT_H

using namespace std;

template <typename T, int size>
class point {
private:
    T coordinates[size];

public:
    point();
    void set_coordinates(const T *);
    void get_coordinates(T *);
};

#endif  /* POINT_H */

point.cは

#include "point.h"

template <typename T, int size>
point::point() {
    for (int i = 0; i < size; i++)
        coordinates[i] = 0;
}

template <typename T, int size>
void point<T, size>::set_coordinates(const T *coordinates) {
    for (int i = 0; i < size; i++)
        this->coordinates[i] = coordinates[i];
}

template <typename T, int size>
void point<T, size>::get_coordinates(T *coordinates) {
    for (int i = 0; i < size; i++)
        coordinates[i] = this->coordinates[i];
}

このテンプレートをとして使用していpoint<int, 2> p0;ます。しかし、コンパイラはpoint<int, 2>定義されていないエラーを出します。私はこれを検索し、2つの解決策を見つけましたexport-1。変数を使用する。しかし、すべてのコンパイラでサポートされているわけではないことを読みました。だから、私はそれを使いたくありません。2.次のような明示的なクラスの特殊化を作成する

template <> class point<int> {
    ...
}

しかし、これを行う他の方法はありませんか?(つまり、C ++標準コンテナーでは、これを行うために何らかの手法を使用した可能性があります。)

4

3 に答える 3

2

これと次の 2 つの FAQ 質問をお読みください - C++ FAQ

于 2012-09-29T10:22:11.707 に答える
1

C++ 標準コンテナーの解決策は、すべてをヘッダー ファイルに保持することです。

于 2012-09-29T10:24:09.237 に答える
1

テンプレートに属するすべての定義point(つまり、メンバー関数を含む) をファイルに配置し、クラスpoint.hを使用するすべてのファイルに含めるpoint必要があります。これにより、コンパイラは必要に応じてテンプレートをインスタンス化できます。詳細については、この質問を参照してください。

C++ コンパイラとリンカには、リンクでの「複数定義」エラーを回避する手段があります (標準の ODR 規則では、これが当てはまる必要があると規定されています)。

于 2012-09-29T10:24:20.783 に答える