2016-04-22 4 views
4

クラスfooには、プライベートタプルメンバーが含まれています。私はgetElement<I>()を使ってこのタプルの要素への参照を取得したいと思います。私は、このソリューションに来たが、オブジェクトが別のクラスbarのコンストラクタに渡されたとき、それは動作しません。テンプレートメンバー関数によるプライベートタプル要素へのアクセス

#include <tuple> 

template<class... Args> 
class foo { 
    std::tuple<Args...> tup_; 

    public: 
    foo(Args... args) : tup_ {args...} {}; 

    template<size_t I> 
    const typename std::tuple_element<I, std::tuple<Args...>>::type & 
    getElement() const {return std::get<I>(tup_);} 
}; 

template<class T> 
class bar; 

template<class T, class U> 
class bar<foo<T,U>> { 
    public: 
    bar(foo<T,U> f) { 
     auto j = f.getElement<0>(); // this is an ERROR!!! Line 22 
    } 
}; 


int main() 
{ 
    foo<int, char> f(12,'c'); 
    auto j = f.getElement<0>(); // but this is OK! 

    bar<decltype(f)> b(f); 

    return 0; 
} 

コンパイラの出力:

main.cpp: In constructor 'bar<foo<T, U> >::bar(foo<T, U>)':                                          
main.cpp:22:33: error: expected primary-expression before ')' token                                        
     auto j = f.getElement<0>(); // this is an ERROR!!!                                          
           ^                                                
main.cpp: In instantiation of 'bar<foo<T, U> >::bar(foo<T, U>) [with T = int; U = char]':                                   
main.cpp:32:24: required from here                                                
main.cpp:22:29: error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator<'                           
     auto j = f.getElement<0>(); // this is an ERROR!!! 
+0

'f.template getElement <0>();' –

+0

@PiotrSkotnickiありがとう、私はこの構文について知りませんでした。コンパイラにとってはどういう意味ですか? – Vahid

答えて

4

あなたはgetElementがあるコンパイラに警告しなければなりませんテンプレート法。それがされていないf.getElement0にバイナリoperator<を呼び出そうとしたように、そうでない場合、コンパイラはf.getElement < 0ようなコードを解析しようとするため、あなたが

f.template getElement<0>() 

この:あなたはtemplateキーワード、例えばを指定する必要があり、それを行うにはやってみたいです。

関連する問題