2014-03-12 20 views
1
#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中遇到的错误:std :: vector使用push_back时的语义问题

/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 *)' 

任何人都有任何想法,为什么发生这种情况?

在此先感谢。

+2

因为它是'const'。毕竟,STL对元素有一些要求。 – keltar

+2

'std :: vector'和'const'通常不能很好地一起玩。 – fredoverflow

+0

一个offtopic建议:尽量避免'void *'。改用模板。 – Manu343726

回答

2

矢量(以及任何其他标准集装箱)管理内存其特定方式的要素。允许执行的许多操作要求该元素不能是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::vectorconst元素没有这样的事情。


解决方案:

使指针非const

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

谢谢:)这工作就像一个魅力,我不知道向量中有这样的限制。我会记住这一点,谢谢大家。 – Akaedintov

0

你必须改变你的typedef于:(作为一个侧面说明,它运作良好,在VS2013)

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

1

在许多不同的编译器,请执行下列操作变化最大保持兼容:

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

^删除常量

void exampleFunction(void *param1, void *param2) 

^消除静电

myVector.push_back(&exampleFunction); 

^添加符号

+0

感谢您的提示,第一条提示解决了我的问题,实际上您的第三条提示非常有用,我在解决方案中实现了它。然而,对于这个问题,你的第二个提示是有问题的。是否可以传递非静态函数作为参数? 因为我认为这是不可能的C++,但我没有专家。如果我删除静态,我得到这个错误。 /Users/onatbas/workspace/cpp/example/main.cpp:24:23:必须调用对非静态成员函数的引用 – Akaedintov

+0

从代码中不清楚它是否是成员函数,如果是,它需要是静态的(在这种情况下)。 – sp2danny

相关问题