template <typename T> 與 template <class T> 等價,慣用 typename。T::嵌套型別 時,編譯器無法確定是型別還是靜態成員,必須加 typename。T t)。T::const_iterator)。int)。模板內使用嵌套相依型別名稱時,前方必須加 typename,否則編譯錯誤(need 'typename' before 'T::xxx')。
class Derived : public Base<T>::Nested)不需 typename。Derived() : Base<T>::Nested(val))不需 typename。/* BInsertSort.cpp
* Created on: 2014.4.17.
* Author: Spike
*/
#include <iostream>
#include <string>
#include <vector>
using namespace std;
template<typename T>
void print2nd(const T& container) {
typename T::const_iterator iter(container.begin()); // 必須加 typename
++iter;
int value = *iter;
cout << value;
}
int main() {
vector<int> vi = {1,2,3,4,5};
print2nd(vi); // 輸出 2
return 0;
}
struct Number { Number(int x) { cout << "Number = " << x << endl; } };
template<typename T> struct Base { typedef Number Nested; };
template<typename T> class Derived : public Base<T>::Nested { // 無需 typename
public:
explicit Derived(int x) : Base<T>::Nested(x) { // 無需 typename
typename Base<T>::Nested temp(7); // 函式內需 typename
}
};