2017-03-27 26 views
-2

解決済み:私はばかだと、実装ファイルではなくヘッダーファイルの最後にヘッダーファイルを含めました。テンプレートクラスの未解決の外部トークン

このプロジェクトは私のC++クラスの課題ですので、どんな指導も大歓迎です。私はテンプレートクラスがコンパイラの問題を引き起こすことを知っていますので、あなたはそれらを読むように特別なことをしなければなりません。私の教授は、これを「修正」する6つのステップを教えてくれました。私はそれらのすべてをフォローしましたが、まだ解決されていないトークンエラーがたくさんあります。

私は取得していますエラー:

LNK2028、LNK2019、LNK1120(それぞれの複数)

ヘッダーファイル:

#include <iostream> 
namespace cs_pairs 
{ 
template <class T> 
class orderedPair 
{ 
public: 
    static const int DEFAULT_VALUE; 

    typedef std::size_t size_type; 
    typedef T value_type; 

    orderedPair(value_type newFirst = DEFAULT_VALUE, value_type newSecond = DEFAULT_VALUE); 
    void setFirst(value_type newFirst); 
    void setSecond(value_type newSecond); 
    value_type getFirst(); 
    value_type getSecond(); 
    orderedPair operator+(const orderedPair& right); 
    bool operator<(const orderedPair& right); 
    void print(); 

    class DuplicateMemberError {}; 
private: 
    value_type first; 
    value_type second; 
}; 

template <class T> 
const int orderedPair<T>::DEFAULT_VALUE = int(); 

#include "orderedPair.h" 
} 

実装ファイル:

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

namespace cs_pairs 
{ 
template <class T> 
orderedPair<T>::orderedPair(value_type newFirst = DEFAULT_VALUE, value_type newSecond = DEFAULT_VALUE) 
{ 
    setFirst(newFirst); 
    setSecond(newSecond); 
} 

template <class T> 
void orderedPair<T>::setFirst(value_type newFirst) 
{ 
    if statement to throw an exception if precondition not met goes here. 
    if (first == second) 
    { 
     throw DuplicateMemberError e; 
    } 
    first = newFirst; 
} 

template <class T> 
void orderedPair<T>::setSecond(value_type newSecond) 
{ 
    if statement to throw an exception if precondition not met goes here.  
    if (first == second) 
    { 
     throw DuplicateMemberError e; 
    } 
    second = newSecond; 
} 

template <class T> 
typename orderedPair<T>::value_type orderedPair<T>::getFirst() 
{ 
    return first; 
} 

template <class T> 
typename orderedPair<T>::value_type orderedPair<T>::getSecond() 
{ 
    return second; 
} 

template <class T> 
orderedPair<T> orderedPair<T>::operator+(const orderedPair<T>& right) 
{ 
    return orderedPair(first + right.first, second + right.second); 
} 


template <class T> 
bool orderedPair<T>::operator<(const orderedPair<T>& right) 
{ 
    return first + second < right.first + right.second; 
} 


template <class T> 
void orderedPair<T>::print() 
{ 
    cout << "(" << first << ", " << second << ")"; 
} 
} 
+0

なぜテンプレートクラスがコンパイラで問題を引き起こすのですか?私が書いたテンプレートクラスには何の問題もありませんでした。 –

+0

コンパイラがテンプレートクラスを読み込む*ためには、パラメータを使って*テンプレートをインスタンス化する*必要があります。良い例は 'std :: vector'です。 –

+3

'orderedPair.h'とは何ですか?おそらく 'namespace cs_pairs'の中にそれを含めたくないでしょう。インスタンス化のためにテンプレートクラスの完全な定義が必要なので、ヘッダーファイル内に実装ファイルを含める必要もあります。 – user975989

答えて

0

削除」を#include orderedPair.h 'をヘッダから削除します。ヘッダーファイル自体を含める必要はありません。

この場合、lan実装ファイルを含めても問題はないかもしれません。