有效的C ++项目43了解如何访问模板化基类中的名称

时间:2012-07-14 03:38:02

标签: c++ templates template-specialization

在本书的第43项中,据说下面的代码不会编译。 我的理解是,当方法LoggingMsgSender::sendClearMsg被实现时会发生编译错误。

然而,对于三个编译器(VC 2005,gcc 4.4.1和一个用于嵌入式设备)我试过了。 它们都没有显示任何编译错误。

是否有任何编译器可以显示书中提到的错误? 欢迎任何建议。 谢谢你的帮助。

(我在我的源代码中找到了VC 2005中潜在的编译器错误 模板基类函数调用,这就是我想要编译错误的原因。 那是一个很长的故事...)

class CompanyX
{
public:
    void sendClearText(){};
};

typedef int MsgInfo;

template<typename Company>
class MsgSender {
public:
    void sendClear(const MsgInfo&)
    {
        Company c;
        c.sendClearText();
    }
};


template<typename Company>
class LoggingMsgSender : public MsgSender<Company> {
public:
    void sendClearMsg(const MsgInfo& info)
    {
        sendClear( info );   // ERROR : will not compile despite clearly being in base class.
    }
};


int main()
{
    LoggingMsgSender<CompanyX> sender;
    sender.sendClearMsg(1); // specialization of the method!!!
}

1 个答案:

答案 0 :(得分:2)

例如

http://liveworkspace.org/code/273c71cd53111dd8c6aaa54e64c53548。得到一个错误。在这种情况下,在函数sendClearMsg中我们应该使用this->sendClear(info);编译器是gcc 4.7.1。所以,现在是2012年,你为什么要使用旧的编译器?