【问题标题】:Vector Iterators of Shared Pointers共享指针的向量迭代器
【发布时间】:2014-10-31 12:27:50
【问题描述】:

我正在尝试获取 shared_ptr 向量的迭代器。它给了我 2 个编译错误:

syntax error : missing ';' before identifier 'begin'
missing type specifier - int assumed. Note: C++ does not support default-int

在代码中,如果我将向量的条目类型替换为字符串或其他基本类型,它就会编译。 [当然这不是我想要的]。怎么回事?

#include <vector>
#include <unordered_map>
#include <memory>

template<class _Kty, class _Ty> class MyClass {
public:
    typedef std::shared_ptr<std::pair<_Kty, _Ty>> Entry;

    // Vector containing pairs of the key & value
    std::vector<Entry> container;

    // Beginning iterator to the vector part
    std::vector<Entry>::iterator begin() noexcept {
        return containervector.begin();
    }
};

【问题讨论】:

    标签: templates c++11 vector iterator shared-ptr


    【解决方案1】:

    std::vector&lt;Entry&gt;::iterator 是一个依赖的名字。

    使用typename 作为编译器关于嵌套::iterator 的提示某事

       typename std::vector<Entry>::iterator begin() noexcept {
    // ^^^^^^^^
    

    问答部分:

    为什么typedef std::string Entry; 没有typename 也能工作?

    std::string 是模板std::basic_string&lt;char&gt; 的显式实例化,因此,编译器知道有关此类型及其嵌套成员类的所有信息。

    为什么shared_ptr 版本的代码需要typename

    这是因为隐藏在std::vector&lt;Entry&gt; 后面的内容取决于提供给模板的参数。也就是说,std::vector&lt;Entry&gt;::iterator 将根据 Entry 的不同而有所不同,Entry 本身使用模板参数(因为它有 std::pair&lt;_Kty, _Ty&gt;),而 iterator 成员可能不存在 em> 在所有,或者它可能是例如静态对象而不是类型。 typename 是编译器的提示。

    【讨论】:

    • 成功了!但我还有一个问题。我将 typedef 行更改为: typedef std::string Entry; &它编译。为什么我需要 shared_ptr 版本的代码的类型名? [& 不是字符串版本]
    猜你喜欢
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多