为什么在迭代时不能使用模板

Pau*_*jan 1 c++ templates g++

编译时:

#include <vector>

template<class T> class foo {

    void bar() {
        std::vector<T> x;
        std::vector<T>::iterator i = x.begin();

    }
};


int main() {
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我明白了:

# g++ ~test.cpp
test.cpp: In member function `void foo<T>::bar()':
test.cpp:7: error: expected `;' before "i"
Run Code Online (Sandbox Code Playgroud)

这不应该工作吗?

RHEL上的g ++版本3.4.3.

Pav*_*aev 7

你可以,但你需要告诉它iterator有一个类型(它不知道的,因为通常它可以依靠T-作为vector一个模板类型,并可能在理论上有专长的一些T地方iterator是一个函数或别的东西).所以,你必须用typename它来表明它总是一个类型:

typename std::vector<T>::iterator i = x.begin();
Run Code Online (Sandbox Code Playgroud)