函数指针

问题描述:

背景函数指针

我使用的是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

第二种类型的ExpectException模板(_RETURNTYPE在声明),需要与传递给它的函数的返回类型。你已经使用了int,但你的函数返回void,所以这给出了一个编译器错误。如果你想在这里明确表示第二种类型应该是void。但是,由于编译器可以从函数参数中找出类型,因此不需要指定它。试试这个:

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