[英]std::vector Semantic issue while using push_back
#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 *)'
任何人都知道为什么会这样吗?
提前致谢。
Vector(以及任何其他标准容器)以特定方式管理其元素的内存。 允许执行的许多操作都要求元素不能是const
。 例如,其fill_n
方法使用相同值的副本填充范围。 或者使用placement 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
}
没有像const
元素那样的std::vector
这样的东西。
解:
使指针非const
:
typedef void (* MyType)(void *, void *);
为了在许多不同的编译器中实现最大的兼容性,请执行以下更改:
typedef void (*MyType)(void *, void *);
^删除const
void exampleFunction(void *param1, void *param2)
^删除静态
myVector.push_back(&exampleFunction);
^添加&符号
您必须将typedef
更改为:
typedef void (* MyType)(void *, void *);
(作为旁注,它在VS2013中运行良好。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.