2016-05-14 10 views
0

クラス:C++なぜ拡張クラス内の関数のスコープを指定する必要がありますか?

template <class TYPE, class KTYPE> 
class ExtAvlTree : public AvlTree<TYPE, KTYPE> { 
    public: 
     void ExtAvlTree_PrintDictionary(); 
     void ExtAvlTree_ProcessNode (KTYPE key); 
     void ExtAvlTree_insertNewWord(string, int); 
}; 

私はこれをしなければならないAvlTree内の関数を使用したい:私は範囲を指定いけない場合

template <class TYPE, class KTYPE> 
void ExtAvlTree<TYPE, KTYPE>::ExtAvlTree_insertNewWord(string word, int data) { 
    TreeNode newWord; 
    newWord.key = word; 
    newWord.data = data; 
    AvlTree<TYPE, KTYPE>::AVL_Insert(newWord); //look here <-- 
} 

を「AvlTreeを::」私はエラーを取得します:私の知識から

error: there are no arguments to 'AVL_Insert' that depend on a template parameter, so a declaration of 'AVL_Insert' must be available [-fpermissive]| 

範囲を指定する必要があり、私はいけない派生クラスで基本クラスから関数を使用した場合。それが問題なら、私はコードブロック16.01 IDEを使用しています。

+0

[、最小完全、かつ検証例]を投稿してください(http://stackoverflow.com/help/mcve)。 –

+0

問題のコードは**テンプレート**を使用しているため、「ベース**クラス**の関数を使用する」の分析は誤解を招く可能性があります。テンプレートはクラスではありません。クラスを作成するための**パターン**です。テンプレートのインスタンス化を有効にするための一連のルールがあり、それらのルールはクラスには適用されません。 –

答えて

1

From my knowledge when using functions from a base class in a derived class i dont have to specify the scope.

が、そのようなルックアップが一意に定義されているため、それが非テンプレートクラスのための事実です。この場合、テンプレート化されたクラスを使用しているため、AvlTreeのルックアップは型を一意に定義しません。実際には、AvlTree自体も型ではありませんが、異なるテンプレート引数で作成できる型のセットについて記述しています。

0

基本クラスAvlTreeは非依存の基本クラスではなく、AVL_Insertは非依存の名前です。非依存の名前は、依存する基本クラスでは検索されません。

このコードを修正するには、従属名がインスタンス化時にのみ参照できるため、AVL_Insertという名前を依存関係にする必要があります。当時、探索されなければならない正確な基礎専門化が分かっています。

あなたが示したとおり、あなたは

AvlTree<TYPE, KTYPE>::AVL_Insert(newWord); 

またはthisを使用することができ、

this->AVL_Insert(newWord); 

またはusingを使用し、

using AvlTree<TYPE, KTYPE>::AVL_Insert; 
AVL_Insert(newWord); 
関連する問題