2014-11-17 17 views
0

我試圖從端口VS2008我的代碼VS2013,我掌握的std ::綁定一些錯誤。 錯誤說錯誤C2668:'bind':對重載函數的模糊調用。 下面是一些代碼:錯誤C2668在綁定,同時從VS2008移植到VS2013

// Relevant prototypes: 
class CLineaPlanta:public SomeBase { /*...*/ }; 
int SomeBase::TipoLinea()const; 
void SomeBase::TipoLinea(int val); 

// function paramater: const std::shared_ptr<CLineaPlanta>& lineasBuscar 
// function parameter: int tipoLinea; 

std::shared_ptr<CLineaPlanta> lineas; 
std::remove_copy_if(lineasBuscar.begin(), lineasBuscar.end(), 
std::back_inserter(lineas), 
     bind(std::not_equal_to<int>(), bind(&CLineaPlanta::TipoLinea, _1), tipoLinea)); 

這段代碼在Visual Studio 2008中的工作,但給在Visual Studio中提到的錯誤2013年

顯然,編譯器有一個很難搞清楚TipoLinea的版本()我正試着打電話。如果我將getter版本重命名爲getTipoLinea,則錯誤消失。

以防萬一它是相關的,SomeBase非抽象的,從CObject(不知道爲什麼)和不相關的這部分代碼的接口派生。

任何人都可以解釋爲什麼VS2008沒有任何這方面的問題,以及如何防止它(除重命名功能,當然)?

+1

您可能會發現它更快,更容易與改寫一個lambda函數。 –

+0

當然。我想我最終會這樣做。但在我開始重寫之前,我想讓它「工作」。我在其他地方也有類似的錯誤。 – MikMik

回答

1

我不知道爲什麼這個代碼在VS2008中工作過。這可能是2008年的bind被作爲基於宏的可變參數仿真實現的結果,其中bind對於要傳遞的每個參數數量有幾個重載,其中一個預期第一個參數是具有相同參數數目的成員函數指針。這將允許編譯器消除歧義,因爲您將一個綁定參數傳遞給bind,因此它知道函數參數必須具有一個參數。

在VS2013,真正variadics被使用,但是這可能意味着第一個參數的類型更通用的,所以編譯器不再能消除歧義。爲了使這個編譯,你需要明確地投下成員指針:

std::remove_copy_if(lineasBuscar.begin(), lineasBuscar.end(), 
    std::back_inserter(lineas), 
    bind(std::not_equal_to<int>(), 
     bind(static_cast<int (SomeBase::*)() const>(&CLineaPlanta::TipoLinea), 
       _1), 
      tipoLinea)); 

但正如尼爾·柯克說,重寫了lambda簡單:

std::remove_copy_if(lineasBuscar.begin(), lineasBuscar.end(), 
    std::back_inserter(lineas), 
    [tipoLinea](const std::shared_ptr<CLineaPlanta>& linea) { 
     return linea->TipoLinea() != tipoLinea; 
    }); 
+0

謝謝,我會嘗試。雖然我在這裏,我也會用copy_if(something)來改變remove_copy_if(not_something) – MikMik