类型和从属名称

时间:2013-12-04 06:47:13

标签: c++ templates types

手动我可以创建一个std::vector<int>::iterator对象,如:

std::vector<int>::iterator i;

所以这里std::vector<int>::iterator是一种类型。但是当我写一个函数时:

template <class T>
std::vector<T>::iterator foo(std::vector<int>::iterator i)
{
    return i;
}

编译器显示警告:

std::vector<T>::iterator' : is a dependent name  not a type

并且代码没有编译。但如果在main中我调用这样的函数:

int main()
{
    vector<int> v;
    foo(v.begin());
}

应解析参数T。那么为什么编译器显示错误?

3 个答案:

答案 0 :(得分:2)

您必须在其前面添加Typename std::vector<T>::iterator依赖于模板参数,即T。因此,您应该使用typename作为前缀: 尝试使用:

typename std::vector<T>::iterator

您可以参考此:http://pages.cs.wisc.edu/~driscoll/typename.html

答案 1 :(得分:2)

以下链接有解决方案和答案,

"Dependent Name is not a Type", but prefixing with "typename" causes compiler crash

简而言之,&#34; std :: vector :: iterator&#34;是从属名称而不是类型名称。所以你不能直接用作typename。您必须指定&#34; typename std :: vector :: iterator&#34;。

答案 2 :(得分:1)

所提供的答案都没有真正解释为什么在这种情况下需要typename。在处理以下代码时,我遇到了同样的问题:

template<typename C>
vector<typename C::iterator> find_all(C& c, C::value_type v) {

    vector<typename C::iterator> res;

    for (auto p = c.begin(); p != c.end(); ++p) {
        if (*p == v)
            res.push_back(p);
    }

    return res;
}

当我尝试编译时,我收到消息&#34;缺少&#39; typename&#39;在依赖类型名称之前&#39; C :: value_type&#39;&#34;。如果我将签名更改为此来源:

vector<typename C::iterator> find_all(C& c, typename C::value_type v) {

它编译没有问题。如果编译器可以找出C&amp; c,为什么它不能算出C :: value_type?