相关疑难解决方法(0)

编译器检查未实例化的模板代码是什么?

例如,以下代码段使用gcc-4.9和clang-602进行编译

class Base                                                                      
{                                                                               
public:                                                                         
    static void foo() {}                                                        
    void badfoo(int i) {}                                                       
};                                                                              

template <typename T>                                                           
class Derived : public Base                                                     
{                                                                               
public:                                                                         
    void bar() { Base::foo(); }                                                 
    void badbar() { Base::badfoo(); }  // compiles ok
    //static void badbar() { Base::badfoo(); }  // compile error                                                                                    
    //void worsebar() { Base::nonexist(); }  // compile error                                   
};                                                                              

int main()                                                                      
{                                                                               
    return 0;                                                                   
}  
Run Code Online (Sandbox Code Playgroud)

但注释掉的行不会编译.

我的问题是:

  1. 为什么badbar()编译但worsebar()不编译?

  2. 如果我badbar()改为静态,它也不会编译,无论是否base::badfoo是静态的.

  3. 标准是否说明了在这种情况下应该检查什么?gcc4.4实际上甚至拒绝编译badbar().

更新:

问题1已被许多答案解释,但似乎编译器有时会更加努力地检查过载,它发生在gcc 4.4.3和4.8.2,而不是4.7.2和4.9.1.

问题2:正如Marco …

c++ gcc templates clang language-lawyer

29
推荐指数
2
解决办法
1253
查看次数

标签 统计

c++ ×1

clang ×1

gcc ×1

language-lawyer ×1

templates ×1