2015-06-03 30 views
0

正在使用的下面一行代碼通過下面的代碼來劃分的對象的數量:的std ::分區誤差分區的類型的對象的矢量時

vector<PrimitiveBvhRepresentation>::iterator lastFirst = std::partition(first, last, &Engine::BVHNode::MiddlePointPartition); 

分區功能利用下面的函數來確定向量中的各個對象是真還是假。

bool MiddlePointPartition(PrimitiveBvhRepresentation current) 
{ 
    if (splittingAxis == 0) 
    { 
     return current.boundingBoxCentroid.x <= splittingAxisValue; 
    } 
    else if (splittingAxis == 1) 
    { 
     return current.boundingBoxCentroid.y <= splittingAxisValue; 
    } 
    else 
    { 
     return current.boundingBoxCentroid.z <= splittingAxisValue; 
    } 
} 

但在執行時,我收到以下錯誤:

Error 63 error C2064: term does not evaluate to a function taking 1 arguments 

當錯誤點擊它需要我的算法類。函數的引用是否寫錯了?

+0

嘗試將函數簽名更改爲'bool MiddlePointPartition(PrimitiveBvhRepresentation const&current)' – CoryKramer

+0

@CoryKramer did not work:/ –

+3

它是一個非靜態成員函數嗎? – Yakk

回答

1

非靜態成員函數不是函數。

嘗試這種情況:

auto lastFirst = std::partition(first, last, 
    [this](auto const& x){return MiddlePointPartition(x);} 
); 
在C++ 14

。在C++ 11中,將auto const&替換爲PrimitiveBvhRepresentation const&

在C++ 03中,考慮一個新的編譯器,或者使用std::bind(&mem_fun, this)作爲partition的第三個參數,而不是lambda。

+0

如果'MiddlePointPartition'是非靜態的,它只能在可以捕獲'this'的上下文中(即'PrimitiveBvhRepresentation'的成員)? –

+0

@ T.C。是的,但我認爲我們必須處於這樣的背景下。人們很少會認爲成員函數指向一個完全不同的,未命名的對象是神奇的。他們經常認爲成員函數是指向這個成員的指針。如果我錯了,修復它很容易,但如果我是正確的,修復將是噪音。 – Yakk

0

標準算法需要一個可以與普通函數調用語法一起使用的函數對象,所以指向成員的指針不具備資格。如果您需要非靜態成員函數,請使用std::mem_fn進行包裝。

std::partition需要一個元謂詞,但你的成員函數,假定它是非靜態的,有兩個參數(隱式this參數,current)。我不清楚你是否希望這個功能成爲靜態成員,或者只是在this上運行。