2017-05-10 57 views
2

我應該寫:應該在C++的const之前或之後使用typename?

template<class T> class Foo { 
    typename const T* x; 
}; 

或:

template<class T> class Foo { 
    const typename T* x; 
}; 
+3

是'typename'甚至不允許在這種情況下?我認爲它僅用於消除靜態數據成員和成員類型的語法。 –

+3

如果其中任何一個導致編譯錯誤,那就是你不應該使用的錯誤。 – molbdnilo

+0

簡單地說:'template class Foo const T * x = nullptr; };' – Jarod42

回答

3

typename不使用這樣的,所以這兩種情況下是無效的,應該產生一個編譯錯誤,像這樣:

main.cpp:4:20: error: expected a qualified name after 'typename' 
    const typename T* x; 
       ^

在這裏你需要像T::myType這樣的東西繼續下去。

甚至這一點,這更糟糕的是:

main.cpp:4:14: error: expected a qualified name after 'typename' 
    typename const T* x; 
      ^
main.cpp:4:14: error: expected member name or ';' after declaration specifiers 

expected a qualified name after 'typename'相關的例子。


關鍵字類型名稱被介紹給指定後面的標識符是一種

詳情請閱讀:Officially, what is typename for?

1

typename需要去與你正在嘗試的類型得到。例如,如果你有

template <typename T> 
void foo(T& t) 
{ 
    typename const T::iterator bar = t.begin(); 
} 

int main() 
{ 
    std::vector<int> bar{1,2,3} 
    foo(bar); 
} 

您將收到「常量」

凡爲

得到一個編譯器錯誤沿

typename const T::const_iterator bar = t.begin();預期嵌套的名稱說明符

const typename T::iterator bar = t.begin(); 

工作得很好。


有關何時,何地,爲什麼templatetypename需要看到出現一個全面的解釋:Where and why do I have to put the "template" and "typename" keywords?

0

有一個在這裏使用typename沒有意義的。

你將不得不使用,如果你要訪問的別名類型像T::type,你不能擁有和T::typeconst之間typename

const typename T::type * x; // ok 
typename T::type const * x; // ok 
typename const T::type * x; // error 
相關問題