函数指针
问题描述:
背景函数指针
我使用的是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()
{
}
答
第二种类型的ExpectException
模板(_RETURNTYPE
在声明),需要与传递给它的函数的返回类型。你已经使用了int
,但你的函数返回void
,所以这给出了一个编译器错误。如果你想在这里明确表示第二种类型应该是void
。但是,由于编译器可以从函数参数中找出类型,因此不需要指定它。试试这个:
Assert::ExpectException<InvalidArgumentException>(TestClass::TestMethod);
...你想通过什么作为_FUNCTOR? –
是的,这可能会有所帮助,不是吗? – basilard99
我想你可能会更好地尝试_FUNCTOR版本。在我看来,第一个重载将会匹配全局函数,而不是您尝试使用的成员函数......或者只是尝试使用全局函数来测试)。 – Luis