Понимание «аргумента шаблона неверно» сообщение об ошибке

Рассмотрим код:

#include <type_traits>
#include <iostream>

struct test1 {
void Invoke() {};
};

struct test2 {
template<typename> void Invoke() {};
};enum class InvokableKind {
NOT_INVOKABLE,
INVOKABLE_FUNCTION,
INVOKABLE_FUNCTION_TEMPLATE
};

template<typename Functor, class Enable = void>
struct get_invokable_kind {
const static InvokableKind value = InvokableKind::NOT_INVOKABLE;
};

template<typename Functor>
struct get_invokable_kind<
Functor,
decltype(Functor().Invoke())
>
{
const static InvokableKind value = InvokableKind::INVOKABLE_FUNCTION;
};

template<typename Functor>
struct get_invokable_kind<
Functor,
decltype(Functor().Invoke<void>())
>
{
const static InvokableKind value = InvokableKind::INVOKABLE_FUNCTION_TEMPLATE;
};int main() {
using namespace std;

cout << (get_invokable_kind<test1>::value == InvokableKind::INVOKABLE_FUNCTION) << endl;
cout << (get_invokable_kind<test2>::value == InvokableKind::INVOKABLE_FUNCTION_TEMPLATE) << endl;

}

То, что я пытаюсь сделать, — это создать метафункцию для тестирования конкретного определения «invokability». И теперь я застрял на этом ошибка компиляции на GCC 4.5.3:

prog.cpp: 37: 3: ошибка: неверный аргумент шаблона 2

Что это значит? Почему я могу специализироваться на decltype(Functor().Invoke()), но не может на decltype(Functor().Invoke<void>())?

4

Решение

Вы должны квалифицировать это с template из-за разбора неясностей:

 decltype(Functor().template Invoke<void>())
^^^^^^^^

Связанные с: Где и почему я должен поставить "шаблон" а также "имяТипа" ключевые слова?

Также рассмотрите возможность использования std::declval скорее, чем Functor() конструктор.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]