2016-10-05 5 views
0

私はテンプレート化されたクラスの使い方を学ぼうとしています。私は単純なテンプレートクラスnumbersを作成しました。このクラスには2つの数値があり、どのデータ型でもかまいません。それから、オブジェクトの2つのうち大きい方の数を返すメソッドを作りました。何らかの理由で私はリンカのエラーを取得し続けます...ここにエラーとコードがあります。何が間違っているのか分からず、Visual Studioは自分のコードに何かを強調していませんでした。C++テンプレートエラー?

unresolved external symbol

それが読み小さすぎるなら、彼らは「未解決の外部シンボル」と言います。読書のための

templated.h

template <class T> 
class numbers { 
public: 
    numbers(T x, T y); 
    T bigger(); 
private: 
    T a, b; 
}; 

templated.cpp

#include "templated.h" 
#include <iostream> 
using namespace std; 

template <class T> 
numbers<T>::numbers(T x, T y) { 
    a = x; 
    b = y; 
} 

template <class T> 
T numbers<T>::bigger() { 
    return a > b ? a : b; 
} 

main.cppに

#include <iostream> 
#include "templated.h" 
using namespace std; 

int main() { 

    numbers <int>pair(1, 2); 
    cout << pair.bigger() << endl; 

    return 0; 
} 

ありがとう!

答えて

3

テンプレートの実装をcpp/cファイルに入れることは想定されていません。すべてを.hファイルに移動します。

これは、cppファイルは実装ライブラリ(dllファイルやコンパイル済みオブジェクトなど)にコンパイルする機能を持つため、テンプレート関数はコンパイル時に定義される未定義型(まだ)を持っているからです。

ただし、コンパイル済みオブジェクトに含めるタイプを指定するcppファイルに、テンプレート関数の特殊化を入れることはできます。

+0

大丈夫なので、テンプレートクラスの関数の実装を、別のファイルに置くことはできません。ただし、関数のデータ型を指定する必要はありません。そうですか? –

+0

使用するすべてのタイプのクラスをインスタンス化すると、cppファイルにテンプレートクラスが実装されます。関数と同じです。 –

+0

ああ、テンプレート化されたクラスには.hファイルを使用しないでください。 –

関連する問題