2014-05-22 42 views
0

我已在使用聲明在工廠使用指針的功能,生成的編譯時間錯誤

template<typename T> using createShapeFunction = Shape<T>(*)(void); 

。這是一個工廠,所以當我限定我使用以下語法createShape()方法如下:

createShapeFunction<T>* function = creationFunctions.at(nameOfType); 
Shape<T>* returnShape = *function(); 

現在,這給我的錯誤:

error C2064: term does not evaluate to a function taking 0 arguments 

誰能告訴我爲什麼?

編輯:我忘了提以下:

  • creationFunction是類型爲std ::地圖<的std :: string,createShapeFunction < T> *> creationFunctions
  • ,我使用的功能創建對象具有以下特徵的靜態形狀* __stdcall的Create()
+0

該消息對應哪一行? –

+0

@OliCharlesworth形狀 * returnShape = * function(); – ciprianr

+0

@ciprianr該行嘗試調用'function',然後取消引用結果。這可能不是你想要的。 – molbdnilo

回答

1

從你的使用條款,createShapeFunction<T>是指向樂趣ction不帶任何參數並返回Shape<T>

createShapeFunction<T>* f聲明f作爲指向createShapeFunction<T>的指針。因此,f是一個指向函數指針的指針,該函數不帶任何參數並返回一個Shape<T>

嘗試使用createShapeFunction<T> function,這應該起作用。


從您的編輯,我上述問題是不是你的問題。我發現使用指向函數的指針是非常可疑的。我很好奇你是如何將這些函數插入到地圖中的。

也就是說,如果你真的想這樣,由弗朗索瓦穆瓦桑指出的那樣,你需要用你的原始定義function和使用

Shape<T> returnShape = (*function)();

注意,返回形狀爲Shape<T>,因爲這是函數返回什麼。

+0

試過,並得到不能從'形狀(__cdecl **)(void)'轉換爲'形狀(__cdecl *)(void)' – ciprianr

+1

@ciprianr如果函數確實必須是指向函數指針的指針,那麼您應該被稱爲'(* function)()'。 '*'在這裏有更高的優先權。你也試圖分配給一個'形狀 *'而函數聲明爲returing'形狀' –

+0

謝謝,這工作得很好。 – ciprianr