【问题标题】:Failing to use stl containers in templated functions/classes未能在模板化函数/类中使用 stl 容器
【发布时间】:2009-05-09 16:45:06
【问题描述】:

当我尝试编译以下代码时...

#include <vector>

template <class T> void DoNothing()
{
    std::vector<T>::iterator it;
}

int main(int argc, char**argv)
{
    return 0;
}

g++ 说:

test.cpp:5: 错误:预期 `;'前 ‘它’

我不明白为什么这是个问题。如果我用std::vector&lt;int&gt;::iterator 替换它,比如说,它可以正常工作。

如你所见,我没有实例化函数,所以 g++ 肯定是模板定义本身有问题,但我看不出它是如何无效的。

感谢您对正在发生的事情的任何建议。

注意,我实际上是在尝试编写一个模板类,但遇到了地图而不是矢量的问题,但这是解决我的问题的最简单的测试用例。

【问题讨论】:

    标签: c++ stl templates


    【解决方案1】:

    您需要使用typename 关键字,因为std::vector&lt;T&gt;::iterator 类型取决于模板参数:

    template <class T> void DoNothing()
    {
        typename std::vector<T>::iterator it;
    }
    

    当您需要使用typename 和不需要它(甚至不允许使用它)时,它实际上可能会令人困惑。这篇文章有一个不错的概述:

    【讨论】:

    • 谢谢!这篇文章也有帮助,尽管在实例化之前没有留下解释似乎仍然很奇怪。
    • 感谢迈克尔的回答,它也帮助了我。我很长一段时间以来一直有同样的问题,现在我知道什么时候使用 typename 关键字了。这篇文章确实有帮助。
    • 虽然有些依赖名称需要在它们前面加上 typename,但有些则不需要。例如,C++03 在模板中表示: template struct F { class A { };无效 f() { A a; } };类型名称“A”是依赖的,因为它相当于说 F::A 和 F::A (并影响实例化上下文中的名称查找)。但是另一段接着说,如果使用非限定名称命名类型成员,则不需要 typename。请参阅 14.6/6 和 c++03 中的新段落 14.6.1/2d。并且 C++1x 引入了当前实例化成员的概念,其中不需要类型名......
    • 我发现另外,womble.decadentplace.org.uk/c++/template-faq.html 是一个非常好的模板常见问题解答,可以帮助解决这些令人困惑的规则
    【解决方案2】:

    我同意这令人困惑。如果没有 typename 关键字,该名称将被视为静态成员。 Vandevoorde 和 Josuttis 所著的C++ 模板一书详细解释了这一点。

    【讨论】:

      【解决方案3】:

      typename std::vector&lt;T&gt;::iterator it; 有效吗?

      编辑:将 template 更改为 typename ... 混淆了我的关键字。

      【讨论】:

        猜你喜欢
        • 2019-04-03
        • 1970-01-01
        • 1970-01-01
        • 2013-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多