2014-03-12 19 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

相關問題