GCC模板编译没有方法检查

时间:2014-02-04 11:46:32

标签: c++ templates visual-c++ gcc g++

我遇到一些代码问题:

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错误的灵魂?

3 个答案:

答案 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但不是吗