为什么编译器在某些情况下看不到模板类中的错误?

时间:2016-12-06 15:04:10

标签: c++ syntax compiler-errors

我偶然发现了g ++(6.2.1)编译器的行为,除了我没有。似乎在某些情况下,当不使用函数的错误定义时,g ++会忽略模板类中的错误。

我们来看这个例子:

class A
{
  bool _var;

  public:
    void myFunc() const
    {
      _var = true;
    }
};

int main()
{
  A a;

  return 0;
}

编译器返回以下错误:

  

错误:在只读对象

中分配成员'A :: _ var'

这是我的预期。现在让我们创建类模板:

template <typename MyType>
class A
{
  bool _var;

  public:
    void myFunc() const
    {
      _var = true;
    }
};

int main()
{
  A<int> a;

  return 0;
}

编译很好,甚至认为我们试图在const方法中为成员变量赋值。 然后,如果我尝试使用myFunc函数,编译器将再次看到错误并拒绝编译。

为什么会这样?编译器不应该在每种情况下都能看到错误吗?

谢谢!

1 个答案:

答案 0 :(得分:4)

这种情况正在发生,因为模板类的成员本身就是模板,因此,只有在使用时才会实例化。未使用的模板只进行某些检查(所谓的两步实例化)。