我遇到一些代码问题:
template<T>
class Ptr{
public:
Ptr(T* ptr_ = 0) : ptr(ptr_) {}
Ptr(Ptr const& other) : ptr(other.ptr->clone()) {}
private:
T* ptr;
};
class Statement{
};
class Test_Statement{
private:
Ptr<Statement> ptr;
}
事情是:类语句没有方法克隆!
当我用GCC 4.6编译代码时,没有错误
但是,当我使用Visual Studio 2005(VC8)进行编译时,有一个错误,即Statement没有克隆方法。
实际上在复制构造函数中可以看起来像这样:
Ptr(Ptr const& other) : ptr(other.ptr->clone()) {
bla bla
some random code
NULL->abcd();
}
没有错误!
所以我的问题是: 1)为什么GCC编译器甚至不检查未使用的代码? 2)是否有一些编译标志或选项,因此GCC会打印错误或警告?
修改:
3)是否存在禁用Visual Compiler错误的灵魂?
答案 0 :(得分:4)
不允许编译器为此代码发出错误,因为无处使用Ptr<Statement>
的复制构造函数。
除非在某处使用并且需要实例化,否则不允许编译器实例化类模板的成员函数的主体(初始化列表计为属于构造函数体)。因此,您可以将代码放入仅对某些(但不是全部)模板参数有效的实体中。然后,它取决于模板的用户最终他的程序是否无效。
如果您尝试复制Test_Statement
,您会发现错误,因为这会触发Test_Statement
的复制构造函数的隐式定义,然后实例化Ptr<Statements>
的构造函数。
答案 1 :(得分:1)
为什么GCC编译器甚至不检查未使用的代码?
模板仅在需要时实例化;并且在此上下文中,类模板的每个成员都被视为一个单独的模板。因此,除非您的程序尝试复制初始化Ptr<Statement>
,否则强制复制构造函数的实例化,否则它将不会被实例化。如果不是,则仅检查基本语法;在不知道ptr->clone()
的类型的情况下,无法确定ptr
是否格式正确。
是否有一些编译标志或选项,因此GCC会打印错误或警告?
我不知道,虽然有lot of flags,所以我可能错过了一个。如果有这样的标志,那么它会破坏很多有效的代码。
是否存在禁用Visual Compiler错误的灵魂?
也许升级到本十年的编译器版本之一可能有所帮助。虽然我没有直接经验,但我觉得这些日子更符合这一点。
答案 2 :(得分:1)
如果您只编译几乎没有选项的代码,那么visual 2005,08,10,12,13似乎运行良好 我认为构建环境中存在可能触发错误的故障或特定选项或标记 我记得cl命令有这个选项:/ TP / GL / O2 / EHsc / MD但不是吗