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 template
từ 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ĩ fun
là một tên phụ thuộc trong ngữ cảnh f
, vì f
bản thân nó không phải là một mẫu. Nếu tôi thay đổi C
thà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 S
và cũng không f
phụ 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 S
thực sự là một tên phụ thuộc, trong bối cảnh của f
nó 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.