2011-09-16 6 views
6

私はC++の名前デアンゲリングコードのテストケースをいくつか書いていますが、これをコンパイルしようとすると奇妙なエラーが発生します:(以下は病理学的に悪いC++コードです。C++テンプレートの質問

"typetest.cpp", line 165: error: nontype "Oog<T, U>::Huh<F>::Wham [with F=T]" 
    is not a template 

任意のアイデアを、私は修正することができますどのように次のように

template<class U, class V> 
class TStruct 
{ 
    U u; 
    V v; 
public: 
    void setU(const U& newu) {u = newu; } 
}; 

template<class T, class U> 
class Oog 
{ 
    T t; 
    U u; 

public: 
    Oog(const T& _t, const U& _u) : t(_t), u(_u) {} 
    void doit(TStruct<T,U> ts1, TStruct<U,T> ts2, U u1, T t1) {} 

    template<class F> 
    class Huh 
    { 
     F f; 
    public: 

     template<class V> 
     class Wham 
     { 
      V v; 
     public: 
      Wham(const V& _v) : v(_v) {} 
      void joy(TStruct<T,V> ts1, U u, F f) {} 
     }; 
    }; 
    int chakka(const Huh<T>::Wham<U>& wu, T t) {} // error here 
}; 

誤差はありますか?

答えて

7

正しい行のようにする必要があり、

int chakka(const typename Huh<T>::template Wham<U>& wu, T t) ... 
    it's a type ^^^^^^^^   ^^^^^^^^ indicate that 'Wham' is a template 

[注:g++ is quite helpful in this case :)]

あなたが許のワムメンバーはテンプレートになること、それを伝える必要があり
+1

ありがとうございます!私は 'typename'について知っていましたが、そのような方法で' template'キーワードを使わなければならないという考えはありませんでした。 –

+0

+1:別の良い答え!今週は少なくとも2回です! :D –

+0

@Tomalak、あなたは「良い答え」のコメントをして、誰かがそれに反対した後であなたの投票/コメントを取り戻す! – iammilind

2

const Huh<T>::template Wham<U> & 
+1

あなたはまだ 'typename'(少なくとも[gcc complains](http://www.ideone.com/jjasO))がありません。 – iammilind

+1

@iammilindはい、それは私には起こりませんでした。私はそれが必要であると確信する前にあなたの答えをしばらく見ていなければならなかった。 –

-1

これで十分です(依存型が問題を引き起こします)

int chakka(const typename Huh<T>::Wham<U>& wu, T t) {}

+0

そうではありません。しかし、そこに着く! (あなたはそれを投稿する前にあなたの答えを試してください) –

+0

うーん..実際に私はそれを試した。私はVS 2010だけが 'template'キーワードを必要としないと仮定します。 – Werolik

+1

nextr downvotingの前にVS 2010で試してください。 – Werolik