1

我正在尝试使用具有可选值的映射初始化 shared_ptr。我将在程序的稍后阶段初始化这些值。

我阅读了以下帖子并将其用作指南:如何在不为 std::map 指定值的情况下添加有效键?

但我的情况有点不同,因为我使用的是 shared_ptr。废话不多说,这是我写的代码:

着色程序.h

...
#include <map>
#include <boost/shared_ptr.hpp>
#include <boost/optional.hpp>

typedef map<string, optional<GLuint> > attributes_map;

class ShaderProgram
{
public:
    ShaderProgram(vector<string> attributeList);
    ...
private:
    shared_ptr<attributes_map> attributes;
};

着色器程序.mm

ShaderProgram::ShaderProgram(vector<string> attributeList)
{
    // Prepare a map for the attributes
    for (vector<string>::size_type i = 0; i < attributeList.size(); i++)
    {
        string attribute = attributeList[i];
        attributes[attribute];
    }
}

编译器通知我以下错误:类型“shared_ptr”不提供下标运算符。

有人知道可能是什么问题吗?

4

1 回答 1

4

attributes是一个shared_ptr并且没有operator[]但一个map有。您需要取消引用它:

(*attributes)[attribute];

请注意map,在构造函数中没有分配任何对象,attributes因此一旦解决了编译器错误,您将获得一些描述的运行时故障。要么分配一个map实例:

ShaderProgram::ShaderProgram(vector<string> attributeList) :
    attributes(std::make_shared<attributes_map>())
{
    ...
}

或者不要使用 a shared_ptr,因为在这种情况下为什么需要动态分配并不明显:

private:
    attributes_map attributes;

通过attributeList引用传递以避免不必要的复制,因为const构造函数不会修改它:

ShaderProgram::ShaderProgram(const vector<string>& attributeList)
于 2012-07-30T10:26:26.397 回答