哪个编译器符合标准?

时间:2013-08-12 19:17:29

标签: c++ c++11 variadic-templates

鉴于此片段:

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编译器进行编译和运行(顺便说一句,没试过)

哪种编译器是对的?

full example

1 个答案:

答案 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.