Это похоже на зрительно-студия проблема. Этот код прекрасно работает в gcc но не удается скомпилировать в Visual Studio:
#include <iostream>
#include <type_traits>
#include <typeinfo>
using namespace std;
true_type foo();
template <typename T>
struct bar{
using def = conditional_t<decltype(foo())::value, char, void>;
};
int main() {
cout << typeid(bar<int>::def).name() << endl;
cout << decltype(foo())::value << endl;
}
Данная ошибка:
ошибка C2146: синтаксическая ошибка: отсутствует
>
перед идентификаторомvalue
Есть ли исправление ошибки для этого или обходной путь?
Я не уверен, может ли это помочь вам, но я могу обойти эту проблему следующим образом:
Сначала определите:
template <typename I> using id = I;
Затем замените каждый экземпляр decltype(foo())::value
с
id<decltype(foo())>::value
Вы также можете использовать std::common_type_t
так же:
std::common_type_t<foo()>::value
Или мои психические силы предсказывают, что вы можете просто захотеть определить отдельный тип для decltype<foo()>
, для удобства:
using id = decltype(foo());
затем заменить все экземпляры decltype(foo())::value
с id::value
,
В вашем вопросе вы используете decltype(foo())
:
using def = conditional_t<decltype(foo())::value, char, void>;
^^^^^
в то время как на Ideone, decltype(foo)
:
using def = conditional_t<decltype(foo)::value, char, void>;
^^^^^
Это разные вещи. В первом случае вы получаете тип результат звонка foo
. Во втором вы получаете тип самой функции.
Хорошо, с того времени все изменилось кардинально.
Код был отредактирован и должен был хорошо скомпилироваться, но компиляция с Visual Studio не удалась, в то время как clang был очень доволен этим кодом и не показывал никаких ошибок и даже предупреждений.
Итак, учитывая, что лязг (последняя версия, используя --std=c++14 -Wall -Wextra
) считает этот код правильным, я считаю, что это должно быть ошибка в VS.