2017-05-25 43 views
0

我試圖調用模板化函數內的矢量成員上的靜態函數。但我無法讓代碼工作。我得到的錯誤:'做'不是'__gnu_cxx :: __ alloc_traits> :: value_type的成員& {aka 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

行,這已經在這裏得到了解答: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但是你不需要調用'(0)',你可以使用'operator []',即'(* v)[0] .Do();',即使對於一個空向量也應該工作(因爲所涉及的元素未被使用)。 – Walter

相關問題