2013-08-12 5 views
2

Учитывая этот фрагмент:Какой компилятор является стандартным?

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 с ноября CTP компилятором (не пробовал лязг, кстати)

Какие компилятор прав?

full example

+4

лязг ++ правильно жалуется отсутствующего 'typename' здесь:' static_cast :: тип> '. g ++ также жалуется на это, но сообщение об ошибке гораздо менее полезно. – dyp

+0

Кажется, что после добавления этого typename он работает в GCC тоже ... ну это смущает :) – user1233963

+1

Было бы полезно предоставить хотя бы сообщение об ошибке и вашу идею, почему оно/неправильно. – PlasmaHH

ответ

1

В данном конкретном случае GCC более совместим со стандартом, как вам не хватает typename когда речь идет о зависимом типа в 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. 
+0

Re «В этом конкретном случае»: Из любопытства, есть ли способ, которым MSVC2012 CTP1 является более стандартным, чем GCC 4.8.1? – Yakk

+0

@Yakk: Я не знаю. В последний раз, когда я видел Windows и/или MSVC, было около 2005 года ...: -] –