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

C++ 为什么';编译器在某些情况下看不到模板类中的错误吗?,c++,syntax,compiler-errors,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” 这正是我所期望的。现在

我偶然发现了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;
}
模板
甲级
{
布尔乌瓦;
公众:
void myFunc()常量
{
_var=真;
}
};
int main()
{
A A;
返回0;
}
即使我们试图在const方法中为成员变量赋值,这也可以很好地编译。 然后,如果我尝试使用myFunc函数,编译器将再次看到错误并拒绝编译

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


谢谢

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

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