鉴于此片段:
template <std::size_t Index, typename T, typename ...Args>
typename type_at<Index, T, Args...>::type
get(T t1, Args... args)
{
return
static_cast<type_at<Index, T, Args...>::type>
(
reinterpret_cast<void*>
(
value_at<Index, T, Args...>::get(t1, args...)
)
);
}
int main()
{
int * a = new int(10);
double* b = new double(3.14);
std::string c = "But I'm a string :(";
std::cout<< *get<0>(a, b, &c) <<"\n";
std::cout<< *get<1>(a, b, &c) <<"\n";
std::cout<< *get<2>(a, b, &c) <<"\n";
}
在GCC 4.8.1上不起作用,但在VS2012中使用Nov CTP编译器进行编译和运行(顺便说一句,没试过)
哪种编译器是对的?
答案 0 :(得分:1)
在这种特殊情况下,当您在代码的typename
部分引用相关类型时,GCC更符合标准,因为您缺少type_at<Index, T, Args...>::type
。
Clang也做了类似的事情并给出了一个很好的错误信息(一如既往):
./test.cc:40:29: error: missing 'typename' prior to dependent type name 'type_at<Index, T, Args...>::type'
static_cast<type_at<Index, T, Args...>::type>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
typename
1 error generated.