2013-08-29 155 views
1

背景函數指針

我使用的是Windows應用商店的單元測試項目++編寫在Windows Store應用中的溫度。在試圖找出如何測試異常時,我在CppUnitTestAssert.h中發現了Assert :: ExpectedException。它的簽名是如下:

template<typename _EXPECTEDEXCEPTION, typename _RETURNTYPE> static void ExpectException(_RETURNTYPE (*func)(), const wchar_t* message = NULL, const __LineInfo* pLineInfo = NULL) 
{ 
    ... 
} 

template<typename _EXPECTEDEXCEPTION, typename _FUNCTOR> static void ExpectException(_FUNCTOR functor, const wchar_t* message = NULL, const __LineInfo* pLineInfo = NULL)` 
{ 
    ... 
} 

的問題是:

它一直以來我用C++編寫了一個很長的時間,所以我有困難,搞清楚如何正確調用該方法。我不斷收到以下錯誤:

'Microsoft::VisualStudio::CppUnitTestFramework::Assert::ExpectException' : none of the 2 overloads could convert all the argument types 

我意識到這可能是實際上的「純」 C++的誤解,但我不知道C++/CX可能有不同的規則,使用函數指針是C++。或者至少我記得規則是什麼。

編輯:

我試圖使用函數指針過載,_RETURNTYPE(* FUNC)(),而不是__FUNCTOR超載。這是沒有編譯的代碼。

Assert::ExpectException<InvalidArgumentException, int>(&TestClass::TestMethod); 

這裏是TestMethod的:

void TestMethod() 
{ 
} 
+0

...你想通過什麼作爲_FUNCTOR? –

+0

是的,這可能會有所幫助,不是嗎? – basilard99

+0

我想你可能會更好地嘗試_FUNCTOR版本。在我看來,第一個重載將會匹配全局函數,而不是您嘗試使用的成員函數......或者只是嘗試使用全局函數來測試)。 – Luis

回答

0

第二種類型的ExpectException模板(_RETURNTYPE在聲明),需要與傳遞給它的函數的返回類型。你已經使用了int,但你的函數返回void,所以這給出了一個編譯器錯誤。如果你想在這裏明確表示第二種類型應該是void。但是,由於編譯器可以從函數參數中找出類型,因此不需要指定它。試試這個:

Assert::ExpectException<InvalidArgumentException>(TestClass::TestMethod);