4
template<class A,class B>
void tmp(){
set<int,int>::iterator it; //works
set<A,B>::iterator it; // doesn't work
}
template<class A,class B>
void tmp(){
set<int,int>::iterator it; //works
set<A,B>::iterator it; // doesn't work
}
的由於C++的語法,你必須明確地告訴C++是set<A,B>::iterator
是一種名稱,而不是靜態成員標識符,使用typename
關鍵字一些相當煩人的限制。例如,該代碼編譯就好:
#include <set>
template<class A, class B>
void tmp() {
std::set<int,int>::iterator x; // OK
typename std::set<A,B>::iterator it; // Also OK
}
int main() {
tmp<int,int>();
return 0;
}
這是因爲C++要求編譯器做出最終決定是否解釋set<A,B>::iterator
作爲一種類型或當它的解析語法的可變/功能; 之前該模板被實例化。但是,在模板實例化之前,不可能做出該確定,因爲在一般情況下,這可能取決於A
和B
的值。因此,除非另有明確說明,否則編譯器將假定它是一個變量/函數。這會導致解析錯誤。 「
」即使在set :: ite之前使用typename ...我無法制作基於模板的容器的迭代器。「... – easyonesorry 2011-02-07 17:13:18