Указатели на функции в C++/CX

Фон

Я пишу приложение для Магазина Windows на C++, используя проект модульного тестирования Магазина Windows. Пытаясь выяснить, как проверить, что было сгенерировано исключение, я нашел Assert::ExpectedException в CppUnitTestAssert.h. Его подписи ниже:

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()
{
}

1 ответ

Второй тип в ExpectException шаблон (_RETURNTYPE в объявлении), должен соответствовать возвращаемому типу функции, переданной в него. Вы использовали int но ваша функция возвращает void, так что это дает ошибку компилятора. Если вы хотите быть явным здесь, второй тип должен быть void, Однако, поскольку компилятор может определить тип по параметру функции, вам не нужно его указывать. Попробуй это:

Assert::ExpectException<InvalidArgumentException>(TestClass::TestMethod);
Другие вопросы по тегам