Tôi nghĩ rằng tất cả các câu trả lời đã đề cập rằng typename
từ khóa, được sử dụng trong hai trường hợp khác nhau:
a) Khi khai báo một tham số kiểu mẫu. ví dụ
template<class T> class MyClass{}; // these two cases are
template<typename T> class MyNewClass{}; // exactly the same.
Không có sự khác biệt giữa chúng và chúng hoàn toàn giống nhau.
b) Trước khi sử dụng tên loại phụ thuộc lồng nhau cho mẫu.
template<class T>
void foo(const T & param)
{
typename T::NestedType * value; // we should use typename here
}
Mà không sử dụng typename
dẫn đến lỗi phân tích / biên dịch.
Điều tôi muốn thêm vào trường hợp thứ hai, như được đề cập trong cuốn sách Scot Meyers có hiệu quả C ++ , là có một ngoại lệ sử dụng typename
trước tên loại phụ thuộc lồng nhau . Ngoại lệ là nếu bạn sử dụng tên loại phụ thuộc lồng nhau làm lớp cơ sở hoặc trong danh sách khởi tạo thành viên , bạn không nên sử dụng typename
ở đó:
template<class T>
class D : public B<T>::NestedType // No need for typename here
{
public:
D(std::string str) : B<T>::NestedType(str) // No need for typename here
{
typename B<T>::AnotherNestedType * x; // typename is needed here
}
}
Lưu ý: Không cần sử dụng typename
cho trường hợp thứ hai (tức là trước tên loại phụ thuộc lồng nhau) không cần thiết kể từ C ++ 20.