9

我在 C++ 中有一个 STL 映射,其中键是无符号整数,值是一个类,其构造函数是:

Foo::Foo(unsigned int integerValue){
    //Some stuff
}

在其他课程中,我在标题处声明了 std::map :

private:
    std::map<unsigned int, Foo> *m_mapFoo;

在 cpp 文件中,我创建了它并插入了 Foo 的实例:

m_mapFoo = new std::map<unsigned int, Foo>;
m_mapFoo->insert(0, new Foo(0));
m_mapFoo->insert(1, new Foo(1));

但是我在插入方法中收到以下错误:

no matching function for call to ‘std::map<unsigned int, Foo, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, Foo> > >::insert(const unsigned int&, Foo*)’

find 方法的类似问题:

m_mapFoo.find(0)->second->someFunctionIntoFooClass();

错误恰好如下:

request for member ‘find’ in ‘((Foo*)this)->Foo::m_mapGeoDataProcess’, which is of non-class type ‘std::map<unsigned int, Foo, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, Foo> > >*’

附加说明:我没有 Foo 复制构造函数,但我认为这不是问题。

任何帮助理解这个错误?

4

3 回答 3

6

您有一个指向包含Foo值的地图的指针

std::map<unsigned int, Foo> *m_mapFoo;

并且您将其视为包含Foo指针值:

std::map<unsigned int, Foo*> *m_mapFoo;

试试这个:

m_mapFoo = new std::map<unsigned int, Foo>;
m_mapFoo->insert(std::make_pair(0, Foo(0)));
m_mapFoo->insert(std::make_pair(1, Foo(1)));

至于第二个错误,你有一个指向地图的指针,所以你需要

std::map<unsigned int, Foo>::iterator it = m_mapFoo->find(0);
if (it) {
  it->second.someFunctionIntoFooClass();
} else {
  // entry not found
}
于 2012-11-20T14:57:20.560 回答
3

您的地图类型化以存储类型对象Foo,而不是指向类型对象的指针Foo。当您尝试使用 初始化元素new并通过 访问其成员时->,您可能想要:

private:
    std::map<unsigned int, Foo*> *m_mapFoo;
于 2012-11-20T14:57:06.237 回答
0

从您提供的少量信息来看,您似乎不太可能需要在任何地方使用指针:试试这个:

在标题中:

private:
    std::map<unsigned int, Foo> m_mapFoo;

在 cpp 文件中:

m_mapFoo[0] = Foo(0);
m_mapFoo[1] = Foo(1);

的语义与operator[]略有不同.insert()。如果您需要.insert(),请使用它。但除非您依赖细微差别,否则请使用更具可读性的operator[].

同样在 find 方法中,如果您避免使用指针并使用 ,则表达式变得更具可读性operator[]

m_mapFoo[0].someFunctionIntoFooClass();
于 2012-11-20T15:24:53.453 回答