Có hai trường hợp trong đó typedef
nhầm lẫn với tôi khi nói đến extern template declaration
và explicit template instantiation
.sử dụng typedef trong bản mẫu và khai báo mẫu bên ngoài
Để minh họa hai xem dưới 2 đoạn mã ví dụ.
xem xét theo gương (Trường hợp 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>;
Tại sao template class example<type_string>
làm việc với typedef? và tại sao nó hợp lệ trong khi template class string_example
thì không?
Hãy xem xét ví dụ (Trường hợp 2) sau:
// 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?
Như chất vấn trong các bình luận ở trên, là nó có giá trị sử dụng typedef trong extern template declaration
, như trong ví dụ trên, và tại sao điều này biên dịch không giống như Case1 nơi không.
Tôi đã đọc về các trường hợp tương tự nhưng không có câu trả lời chi tiết nào cho trên 2 câu hỏi. xây dựng chi tiết được đánh giá rất nhiều!
em biết tại sao lớp 'mẫu ví dụ;' và 'extern lớp mẫu ví dụ ;' làm việc (hoặc nó không với GCC), tôi đang sử dụng MSVC-140 btw và nó hoạt động. cám ơn rất nhiều! –
codekiddy
'ví dụ' đủ điều kiện làm * đơn giản-mẫu-id *. –
cảm ơn, tôi đã thực hiện một số thử nghiệm với GCC và có trường hợp g ++ không xác định các tham chiếu cho các trường hợp như 'example' nhưng msvc biên dịch tốt, cũng có trường hợp msvc đưa ra cảnh báo chứ không phải g ++, rõ ràng là trường hợp này không được mô tả và cũng không được xác định theo tiêu chuẩn. –
codekiddy