2017-05-25 16 views
0

私は、テンプレート関数内のベクトルのメンバに対して静的関数を呼び出そうとしています。しかし、私はコードを動作させることはできません。私はエラーが表示されます: 'Do'は '__gnu_cxx :: __ alloc_traits> :: value_typeのメンバーではありません& {a &}'アイデア?テンプレートされたコンテナメンバのクラス関数を呼び出す

struct A { 
    static void Do() { cout << "Hey.\n"; } 
}; 

template <typename T> 
void foo(T* v) { 
    decltype(v->at(0))::Do(); 
} 

int main() { 
    vector<A> v; 
    foo(&v); 
    return 0; 
} 
+0

OK、これはここで答えられました:https://stackoverflow.com/questions/44189845/stdvector-insert-without-knowing-the-type-of-the-elements?noredirect=1#comment75393783_44189845 –

+0

なぜあなたは質問していますかこれはあなたの前の質問(40分早く)でもこれに有効な答えが得られたかどうか?同じ人から実際にここに返信しています。 – Walter

答えて

3
T::value_type::Do(); 

それとも

std::remove_reference<decltype(v->at(0))>::type::Do(); 

それとも

std::decay<decltype(v->at(0))>::type::Do(); 

それとも、静的ネスを強制気にしない場合(およびベクトルを知っている空ではないことにする):

v->at(0).Do(); 
+0

Nit:ベクトルが空の場合、最後のバージョンは機能しないので、静的性が必要です。 –

+0

@LajosNagyしかし、あなたは 'at(0)'を呼び出す必要はありません。 'operator * '、すなわち'(* v)[0]。Do(); 'を使うことができます。 (参照された要素は使用されていないため)。 – Walter

関連する問題