Tôi có đoạn mã sau:
template <typename TC>
class C
{
    struct S
    {
        template <typename TS>
        void fun() const
        {}
    };
    void f(const S& s)
    {
        s.fun<int>();
    }
};
// Dummy main function
int main()
{
    return 0;
}Khi xây dựng điều này với cả gcc 9.2 và clang (9.0), tôi gặp lỗi biên dịch do templatetừ khóa được yêu cầu để gọi fun. Clang cho thấy:
error: use 'template' keyword to treat 'fun' as a dependent template name
        s.fun<int>();
          ^
          template Tôi không hiểu tại sao trình biên dịch nghĩ funlà một tên phụ thuộc trong ngữ cảnh f, vì fbản thân nó không phải là một mẫu. Nếu tôi thay đổi Cthành một lớp thông thường thay vì một mẫu, lỗi sẽ biến mất; tuy nhiên, tôi không hiểu tại sao cần có một lỗi ở nơi đầu tiên kể từ khi không phải Svà cũng không fphụ thuộc vào TC.
Thật kỳ lạ, MSVC 19,22 biên dịch điều này chỉ tốt.
Ghi chú
Trước khi bỏ phiếu để đóng dưới dạng dupe của Where và tại sao tôi phải đặt từ khóa "template" và "typename"? vui lòng xem đây là trường hợp đặc biệt, ngay cả khi Sthực sự là một tên phụ thuộc, trong bối cảnh của fnó sẽ không bị phụ thuộc nếu không phải vì thực tế rằng chúng là thành viên của việc khởi tạo hiện tại.