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

Фон

Я пишу приложение Магазина Windows на С++, используя проект модульного тестирования Магазина 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)` 
{
    ...
}

Вопрос:

Прошло много времени с тех пор, как я кодировал на С++, поэтому мне трудно понять, как правильно вызвать метод. Я продолжаю получать следующую ошибку:

'Microsoft::VisualStudio::CppUnitTestFramework::Assert::ExpectException' : none of the 2 overloads could convert all the argument types

Я понимаю, что на самом деле это может быть неправильное понимание «чистого» С++, но я не уверен, что в С++/CX могут быть другие правила использования указателей функций, чем в С++. Или, по крайней мере, то, что я помню о правилах.

РЕДАКТИРОВАТЬ:

Я пытаюсь использовать перегрузку указателя функции, _RETURNTYPE (*func)(), а не перегрузку __FUNCTOR. Вот код, который не компилируется.

Assert::ExpectException<InvalidArgumentException, int>(&TestClass::TestMethod);

Вот метод тестирования:

void TestMethod()
{
}

person basilard99    schedule 29.08.2013    source источник
comment
... Что вы пытаетесь передать как _FUNCTOR?   -  person James McNellis    schedule 30.08.2013
comment
Да, наверное, это помогло бы, не так ли?   -  person basilard99    schedule 03.09.2013
comment
Я думаю, вам лучше попробовать версию _FUNCTOR. Мне кажется, что первая перегрузка будет соответствовать глобальной функции, а не функции-члену, которую вы пытаетесь использовать... или просто попробуйте использовать глобальную функцию для тестирования).   -  person Luis    schedule 03.09.2013
comment
Я, конечно, мог бы попробовать это.   -  person basilard99    schedule 04.09.2013


Ответы (1)


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

Assert::ExpectException<InvalidArgumentException>(TestClass::TestMethod);
person eoinmullan    schedule 17.10.2013