std :: vector使用push_back时的语义问题

时间:2014-03-12 11:16:44

标签: c++ vector stl const std

#include <vector>
typedef void (* const MyType)(void *, void *);
static void exampleFunction(void *param1, void *param2)
{
    // ...
}

int main(int argc, char* argv[])
{
    std::vector<MyType> myVector;
    myVector.push_back(exampleFunction); // fails.
} 

以下是代码,似乎//fails的行不可编译。 我发表评论,没有问题。但如果它打开了,这就是我在XCode中遇到的错误:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/c++/v1/memory:1593:27: Cannot initialize a parameter of type 'void *' with an lvalue of type 'void (*const *)(void *, void *)'

任何人都知道为什么会这样吗?

提前致谢。

3 个答案:

答案 0 :(得分:2)

Vector(以及任何其他标准容器)以特定方式管理其元素的内存。允许执行的许多操作要求元素不能是const。例如,其fill_n方法使用相同值的副本填充范围。或使用展示位置new构建元素:

 /**
 * Constructs an object in existing memory by invoking an allocated
 * object's constructor with an initializer.
 */
 template<typename _T1, typename _T2>
  inline void
  _Construct(_T1* __p, const _T2& __value)
  {
    // _GLIBCXX_RESOLVE_LIB_DEFECTS
    // 402. wrong new expression in [some_]allocator::construct
    ::new(static_cast<void*>(__p)) _T1(__value);
                     ^
                    // here you would get an error: invalid static_cast
  }

没有像std::vector这样的const元素。


解决方案:

使指针非 - const

typedef void (* MyType)(void *, void *);

答案 1 :(得分:1)

为了在许多不同编译器中实现最大兼容性,请执行以下更改:

typedef void (*MyType)(void *, void *);

^删除const

void exampleFunction(void *param1, void *param2)

^删除静止

myVector.push_back(&exampleFunction);

^添加&符号

答案 2 :(得分:0)

您必须将typedef更改为:

typedef void (* MyType)(void *, void *);

(作为旁注,它在VS2013中运行良好。)