我有以下代码:
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;
}
在同时使用gcc 9.2和clang(9.0)进行构建时,由于template调用关键字需要关键字,因此出现编译错误fun。lang声显示:
error: use 'template' keyword to treat 'fun' as a dependent template name
        s.fun<int>();
          ^
          template 
我不明白为什么编译器fun在的上下文中认为是从属名称f,因为f它本身不是模板。如果我改用C普通班代替模板,那么错误就会消失;但是,我不明白为什么一开始就应该出错,因为既不依赖S也不f依赖TC。
奇怪的是,MSVC 19.22可以很好地进行编译。
注意
在投票否决之前,为什么我必须放置“模板”和“类型名”关键字?请考虑这是一种特殊情况,即使即使S确实确实是从属名称,在上下文中f,如果不是因为它们是当前实例的成员,也就不会从属。
                  评论不作进一步讨论;此对话已转移至聊天。
                
                
                  
                    —
                    巴尔加夫Rao