Есть два случая, когда 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 вопроса. подробная разработка очень ценится!
вы знаете, почему 'Пример шаблона класса, и' ехЬегп пример шаблонного класса , 'работает (или не с GCC), я использую MSVC-140 Кстати, и это работает. большое спасибо! –
codekiddy
'example' квалифицируется как * simple-template-id *. –
спасибо, я сделал некоторые тесты с GCC, и есть случаи, когда g ++ выдает неопределенные ссылки для таких случаев, как «пример», но msvc компилируется просто отлично, есть также случаи, когда msvc дает предупреждения, но не g ++, очевидно, что эти случаи ни один из них не описан и не определен стандартом. –
codekiddy