这似乎是visual-studio问题。此代码runs fine in 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
是否有针对此问题或解决方法的错误修复?
答案 0 :(得分:2)
在您的问题中,您使用的是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对这段代码非常满意,并没有显示任何错误甚至是警告。
所以,鉴于clang(最新版本,使用--std=c++14 -Wall -Wextra
)发现此代码正确,我相信这应该是 VS 中的错误。
答案 1 :(得分:1)
我不确定它是否可以帮到你,但我能解决这个问题:
首先定义:
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
。