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

标签 c++ syntax compiler-errors

<分区>

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

让我们举个例子:

class A
{
  bool _var;

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

int main()
{
  A a;

  return 0;
}

编译器返回以下错误:

error: assignment of member 'A::_var' in read-only object

这是我所期望的。现在让我们制作类模板:

template <typename MyType>
class A
{
  bool _var;

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

int main()
{
  A<int> a;

  return 0;
}

即使我们试图在 const 方法中为成员变量赋值,这也能正常编译。 然后,如果我尝试使用 myFunc 函数,编译器将再次看到错误并拒绝编译。

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

谢谢!

最佳答案

发生这种情况是因为模板类的成员本身就是模板,因此仅在使用时实例化。未使用的模板仅经过某些检查(所谓的两步实例化)。

关于c++ - 为什么编译器在某些情况下看不到模板类中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40998467/

相关文章:

java - 为什么在 java 中的 catch block 中需要括号?

c++ - typedef 中类型名的使用与继承

c++ - 编译在 g++ 4.7.1 中达到虚拟内存限制?

ios - 两个类通过导入它们的头文件(通过#import)相互访问会导致错误

c++ - OpenCV 立体校准具有较低的重投影误差,但不正确

c++ - UNICODE、UTF-8 和 Windows 困惑

c++ - 使用 Dijkstra 算法在网格上进行寻路

Java反射(reflect)Class.forName失败

objective-c - 非常简单的 Objective-C HTTP GET 请求代码无法编译

c++ - 算术运算符参数类型