2016-10-07 3 views
1

に問題があるためです。 .TEMPLATEファイルは.hファイルでは '..'の前に 'typename'が必要です。テンプレートクラスをコンパイルしようとすると、 '..'が依存スコープ

template <typename dataType> 
class Node {  
private: 
    dataType nodeData; 
    Node<dataType>* nextLink; 
    Node<dataType>* previousLink; 
public:  
    Node(const dataType& nodeData); 

    // methods 

template <typename dataType> 
Node<dataType>::dataType Node<dataType>::getData() const { 
    return nodeData; 
}; 

コンパイルしようとしたとき、私は取得エラーです:

need ‘typename’ before ‘Node<dataType>::dataType’ because ‘Node<dataType>’ is a dependent scope 

Node<dataType>::dataType Node<dataType>::getData() const { 

それでは、私は型名を追加それは私にこのエラーを与える:

error: expected nested-name-specifier before ‘dataType’ 
     typename dataType getData() const; 
       ^
error: expected ‘;’ at end of member declaration 
error: declaration of ‘int Node<dataType>::dataType’ 
error: shadows template parm ‘class dataType’ 
     template <typename dataType> 
       ^

どうしたのですか?

template <typename dataType> 
dataType Node<dataType>::getData() const { 
    return nodeData; 
} 

コンパイラのメッセージは、それが適切な定義を見つけることができませんので、この場合には誤解を招くされ、それが前提としていますdataTypeと呼ばれる全くメンバーはありません

+0

コンパイラが示すように 'node :: dataType'の前に' typename'を 'dataType'の前に置いたようです。これは本当ですか?コード変更後にソースを表示できますか? –

+1

'' Node :: dataType'の前に 'typename'を置くとメッセージが表示されます。 'dataType'の前ではありません –

+0

@BrianCainはそれが重複とは思わない –

答えて

2

は、私は、戻り値の型がちょうどテンプレートdataTypeあるべきと仮定しますdataTypeはテンプレート引数を参照します。

0
template <typename DataType> 
class Node { 
public: 
    using dataType = DataType; 
private: 
    dataType nodeData; 
    Node<dataType>* nextLink; 
    Node<dataType>* previousLink; 
public:  
    Node(const dataType& nodeData); 
    dataType getData() const; 
}; 
template <typename DataType> 
typename Node<DataType>::dataType Node<DataType>::getData() const { 
    return nodeData; 
}; 

specfy typenameこのようにしてください。一つの具体的な問題を推測しなければならないので

http://melpon.org/wandbox/permlink/Agu2s6vw6OLfbbRh

0

提示のコード例は、不完全あります。それは正確な詳細を知らなくても問題を解決できる場合がありますことを示す

template< class Item > 
struct Node 
{ 
    Node* next; 
    Node* prev; 
    Item item; 
}; 

はしかし、ここであなたが直面しているような問題もなく、実用的な方法でそのクラスを行う方法です。

関連する問題