2013-02-06 12 views
6

災禍:C++テンプレートタイプstructを持つ関数テンプレートの引数は、このコードはコンパイルされませんunexplicably

struct sometype 
{ 
    template <typename T> 
    T* get() { return nullptr; } 
}; 

template <typename T> 
struct anothertype 
{ 
#if 1 
    template <typename T2> struct some_wrapper { typedef T2 type; }; 
    typedef typename some_wrapper<sometype>::type thetype; 
#else 
    typedef sometype thetype; 
#endif 
    typedef thetype* Ptr; 

    Ptr m_ptr; 
    T* get() { return m_ptr->get<T>(); } 
}; 

私は0から#if引数を変更すると、それが何らかの形で固定されています。誰かがこれにいくつかの光を当てることができますか?明らかに意味のないsome_wrapperのものは実際に私の実際のコードで何か役に立つものです。

私は-fstd=gnu++11とG ++ 4.7.1を使用しています、私はanothertype<T>::getを宣言行を指している(以下のようにエラーがされています

error: expected primary-expression before '>' token 
error: expected primary-expression before ')' token 
+0

コンパイラで投稿したコードを正確に実行すると、そのエラーが発生しますか? –

+0

@DavidRodríguez-dribeas http://ideone.com/N8dQoj(正確には質問のコード) – leemes

答えて

6

次のようにあなたの関数呼び出しを修正する必要があり、templateキーワードを追加する:あなたが必要な賭け

T* get() { return m_ptr->template get<T>(); } 

this linkに構文の説明があります。

8

それはすべてあなたのtypedefで伝えるのは難しいですが、私は思います

m_ptr->template get<T>(); 
+0

+1が最初です。 –

+0

しかし...なぜですか? 'm_ptr'は* always *' sometype * 'です。 – ipc

+1

@ipc彼は '#if 1'を真とするので、' m_ptr'は 'typename some_wrapper :: type *'、従属型 –

関連する問題