#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 *)'
任何人都知道为什么会这样吗?
提前致谢。
答案 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中运行良好。)