我應該寫:應該在C++的const之前或之後使用typename?
template<class T> class Foo {
typename const T* x;
};
或:
template<class T> class Foo {
const typename T* x;
};
我應該寫:應該在C++的const之前或之後使用typename?
template<class T> class Foo {
typename const T* x;
};
或:
template<class T> class Foo {
const typename T* x;
};
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'相關的例子。
關鍵字類型名稱被介紹給指定後面的標識符是一種
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();
工作得很好。
有關何時,何地,爲什麼
template
和typename
需要看到出現一個全面的解釋:Where and why do I have to put the "template" and "typename" keywords?
有一個在這裏使用typename
沒有意義的。
你將不得不使用,如果你要訪問的別名類型像T::type
,你不能擁有和T::type
const
之間typename
const typename T::type * x; // ok
typename T::type const * x; // ok
typename const T::type * x; // error
是'typename'甚至不允許在這種情況下?我認爲它僅用於消除靜態數據成員和成員類型的語法。 –
如果其中任何一個導致編譯錯誤,那就是你不應該使用的錯誤。 – molbdnilo
簡單地說:'template class Foo const T * x = nullptr; };' –
Jarod42