C++ .template 關鍵字
阿新 • • 發佈:2021-01-07
template
關鍵字除了用於作為模板宣告之外,還有一個作用,顯式說明模板成員函式,這一點類似於typename
顯式說明成員型別。給出程式碼例項:
#include <iostream>
template<typename T, size_t N>
class Collection {
public:
template<size_t I>
void setValue(T &&t) {
data[I] = t;
}
template< size_t I>
T getValue() const {
return data[I];
}
private:
T data[N];
};
template<typename T, size_t N, size_t I>
void printElem(Collection<T, N> &con) {
// ==> 1
std::cout << con.template getValue<I>() << std::endl;
}
int main() {
// 正常版本,這裡不用宣告.template
Collection<double, 2> con{};
con.setValue<0>(0.1);
con.setValue<1>(1.5);
std::cout << con.getValue<0>() << std::endl;
printElem<double, 2, 1>(con);
}
在上面程式碼1中,如果不加.template
關鍵字,則會報錯。這麼理解,printElem
是個模板函式,傳入的引數Collection
型別依賴於printElem
的模板引數。但是,1處在完成例項化填充之前,編譯器不會實際賦予模板實際的型別,因此這裡的.template
I
是型別,而不是其他的資料,因此getValue
才會被編譯器認為是成員函式,而不是成員變數的。