2015-12-29 8 views
5

Есть два случая, когда typedef меня смущает, когда дело доходит до extern template declaration и explicit template instantiation.с использованием typedef в оформлении шаблона и декларации шаблона extern

Чтобы проиллюстрировать эти два, см. Ниже 2 фрагмента кода кода.

Рассмотрим следующий пример (случай 1):

// suppose following code in some cpp file  
template <typename T> 
    struct example 
{ 
    T value; 
}; 

// valid typedefs 
typedef example<int> int_example; 
typedef example<std::string> string_example; 

// explicit instantiation using above typedefs 
template class int_example; // -> compile time error 
template class string_example; // -> compile time error 

// instead we need to use type names 
template class example<int>; // -> OK 
template class example<std::string>; // -> OK 

// QUESTION 1: Why does this work however? is this valid code? 
typedef std::string type_string; 
template class example<type_string>; 

Почему template class example<type_string> работа с ЬурейеЕ? и почему это действительно, пока template class string_example нет?

Рассмотрим следующий пример (случай 2):

// suppose following code is in some header file 
template <typename T> 
struct example 
{ 
    T value; 
}; 

// valid typedefs 
typedef std::string type_string; 
typedef example<type_string> string_example; 

// Explicit instantiation declaration 
// QUESTION 2: Is this valid code? if not why not? 
extern template string_example; // -> at least this compiles, but is it OK? 

Как сомнение в комментарии выше, он действует использовать ЬурейеЕ в extern template declaration, как в приведенном выше примере, и почему это компилировать в отличие от Case1, где нет.

Я читал о подобных случаях, но никто не дает подробный ответ на вышеуказанные 2 вопроса. подробная разработка очень ценится!

ответ

2
template class int_example; 

не является юридическим. Из C++ 11 Stanard:

14.7.2 Явной конкретизация

2 Синтаксиса для явной Инстанциации:

явной конкретизация:
extern неавтоматическогоtemplate

Существуют две формы явного инстанцирования: явное определение инстанцирования и декларация о явном создании. Явная декларация о создании начинается с ключевого слова extern.

3 Если явная Инстанциация для класса или члена класса, разработан типа-спецификатор в декларации должен включать простой-шаблонный идентификатор.

простой шаблон-идентификатор определен в разделе А.12 Шаблоны как:

простой шаблон-ID:
имя шаблона<шаблона аргумент-список неавтоматического>

int_example не квалифицируется как simple-template-id.
example<int> имеет простой шаблон-идентификатор.

Однако, по этой логике,

extern template string_example; 

не является законным либо. Я не знаю, как это работает для вас. Я получил следующую ошибку, когда попытался скомпилировать такую ​​строку в g ++ 4.9.3.

socc.cc:15:31: error: expected unqualified-id before ‘;’ token 
extern template string_example; // -> compile time error 
+0

вы знаете, почему 'Пример шаблона класса , и' ехЬегп пример шаблонного класса , 'работает (или не с GCC), я использую MSVC-140 Кстати, и это работает. большое спасибо! – codekiddy

+0

'example ' квалифицируется как * simple-template-id *. –

+0

спасибо, я сделал некоторые тесты с GCC, и есть случаи, когда g ++ выдает неопределенные ссылки для таких случаев, как «пример », но msvc компилируется просто отлично, есть также случаи, когда msvc дает предупреждения, но не g ++, очевидно, что эти случаи ни один из них не описан и не определен стандартом. – codekiddy

 Смежные вопросы

  • Нет связанных вопросов^_^