2016-04-01 2 views
-1

У меня есть несколько шаблонов, которые проверяют, определен ли какой-либо оператор для определенного типа, и также проверяю тип возвращаемого выражения. Когда я создаю экземпляр этого шаблона с определенными типами, все в порядке, но для некоторых типов я получаю внутреннюю ошибку компилятора в MSVC. В GCC я получаю ошибку «аргумент шаблона недействителен». Вот строка, вызывающая проблемы, когда я создаю проверку после инкремента:Ошибка вложенного шаблона C++

template <typename _Type, typename _ReturnType> 
static auto test(_Type&& var, _ReturnType&&) 
-> decltype(std::enable_if_t<std::is_same<_ReturnType, decltype((var) OPERATOR)>>(), std::true_type()); 

С этим кодом что-то не в порядке?

Примечание: ОПЕРАТОР - это макрос, расширенный для оператора, который я хочу проверить. Весь шаблон является частью большего макроса, который я использую, чтобы избежать повторения кода.

+0

Пожалуйста, напишите [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). –

ответ

0

Я думаю, что проблема заключается в том, что std::enable_if_t ожидает bool, но вы не поставляете его через std::is_same. Чтобы получить результат от std::is_same, вам нужно получить доступ к переменной value (которая имеет результат проверки).

template <typename _Type, typename _ReturnType> 
static auto test(_Type&& var, _ReturnType&&) 
-> decltype(std::enable_if_t<std::is_same<_ReturnType, decltype((var) OPERATOR)>::value>(), std::true_type()); 
+0

Не вводить черты define 'operator()' для возврата значения ':: value'? – Rerito

+0

@ Рерито они делают, но только с C++ 14 – Rakete1111

Смежные вопросы