2011-02-07 95 views
4
template<class A,class B> 
void tmp(){ 
    set<int,int>::iterator it; //works 
    set<A,B>::iterator it; // doesn't work 
} 

回答

6

的由於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作爲一種類型或當它的解析語法的可變/功能; 之前該模板被實例化。但是,在模板實例化之前,不可能做出該確定,因爲在一般情況下,這可能取決於AB的值。因此,除非另有明確說明,否則編譯器將假定它是一個變量/函數。這會導致解析錯誤。 「

+0

」即使在set :: ite之前使用typename ...我無法制作基於模板的容器的迭代器。「... – easyonesorry 2011-02-07 17:13:18