我偶然发现了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函数,编译器将再次看到错误并拒绝编译。
为什么会这样?编译器不应该在每种情况下都能看到错误吗?
谢谢!
答案 0 :(得分:4)
这种情况正在发生,因为模板类的成员本身就是模板,因此,只有在使用时才会实例化。未使用的模板只进行某些检查(所谓的两步实例化)。