2012-04-27 21 views
3

私はtupleの独自の実装で(主に学習目的のために)作業していますが、問題が発生しました。 (それらの多くがありますが、これは不可欠です)、エラー、次の原因バリデーショナルテンプレートと "予想されるタイプ"エラー

namespace Rose 
{ 
    template<typename T> 
    struct RemoveReference 
    { 
     typedef T Type; 
    }; 

    template<typename T> 
    struct RemoveReference<T &> 
    { 
     typedef T Type; 
    }; 

    template<typename... Elems> 
    class Tuple; 

    template<typename First, typename... Elems> 
    class Tuple<First, Elems...> 
    { 
    public: 
     Tuple(First a, Elems... more) 
      : More(more...), Element(a) 
     { 
     } 

     Tuple<First, Elems...> & operator=(const Tuple<RemoveReference<First>::Type, 
              RemoveReference<Elems>::Type...> & rhs) 
     { 
      this->Element = rhs.Element; 
      this->More = rhs.More; 

      return *this; 
     } 

    private: 
     Tuple<Elems...> More; 
     First Element; 
    }; 

    template<typename Only> 
    class Tuple<Only> 
    { 
    public: 
     Tuple(Only a) : Element(a) 
     { 
     } 

     Tuple<Only> & operator=(const Tuple<RemoveReference<Only>::Type> & rhs) 
     { 
      this->Element = rhs.Element; 

      return *this; 
     } 

    private: 
     Only Element; 
    }; 
} 

int main() 
{ 
    Rose::Tuple<int, float, int> t(1, 1.f, 2); 
} 

:私は、次のコードしている

error: type/value mismatch at argument 1 in template parameter list for 'template struct Rose::Tuple' error: expected a type, got 'Rose::RemoveReference::Type'

は、私は本当にについては、この何を理解していません。単独で使用した場合、RemoveReference形質が機能します。私はG ++ 4.6.1、4.5.1およびクラン++ 2.9でこのコードを試してみました

は、ここでは、2つのテストケースです。

これらのエラーが表示される理由は何ですか?

+4

単純な 'typename'を見逃す可能性がありますか? – juanchopanza

+0

パラメータ 'Tuple'のテンプレートパラメータリストを意味しますか? – Griwes

+0

バリデーションのテンプレートのルールはあまりよく分かりませんが、 'Elems'が' typename ... Elems'のときに 'RemoveReference 'を実行できることは確かですか? –

答えて

5

RemoveReference<T>::Typeは依存タイプですので、あなたはここにtypenameを追加する必要があります。

 Tuple<First, Elems...> & operator=(const Tuple<typename RemoveReference<First>::Type, 
                 typename RemoveReference<Elems>::Type...> & rhs) 

と、おそらく他の場所。

+0

実際には、すべてのエラーが修正されました。 [here](http://ideone.com/qIiSg)を参照してください。他のものを試す前にすべての可能な場所に 'typename'を入れなければならないようです。また、答えの最初に 'RemoveReference :: Type'を意味し、' tuple :: type'ではないと思いますか? – Griwes

+0

@Griwes、はい、私はRemoveReferenceを意味しました。訂正してくれてありがとう。 – juanchopanza

関連する問題