【问题标题】:Function Pointers in C++/CXC++/CX 中的函数指针
【发布时间】:2013-08-29 20:35:54
【问题描述】:

背景

我正在使用 Windows 应用商店单元测试项目用 C++ 编写一个 Windows 应用商店应用程序。在试图弄清楚如何测试是否引发了异常时,我在 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);

这里是测试方法:

void TestMethod()
{
}

【问题讨论】:

  • ...你想作为 _FUNCTOR 传递什么?
  • 是的,那可能会有帮助,不是吗?
  • 我认为您最好尝试 _FUNCTOR 版本。在我看来,第一个重载将匹配全局函数,而不是您尝试使用的成员函数......或者只是尝试使用全局函数进行测试)。
  • 我当然可以试试。

标签: c++-cx


【解决方案1】:

ExpectException 模板中的第二种类型(声明中的_RETURNTYPE),需要匹配传入它的函数的返回类型。您使用了int,但您的函数返回void,所以这会导致编译器错误。如果你想在这里明确,第二种类型应该是void。但是,由于编译器可以从函数参数中找出类型,因此您无需指定它。试试这个:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 2010-11-19
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多