Указатели на функции в 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);