1

本の項目 43 では、以下のコードはコンパイルできないと書かれています。私の理解では、メソッドがインスタンス化されるとコンパイルエラーが発生しますLoggingMsgSender::sendClearMsg

ただし、3 つのコンパイラ (VC 2005、gcc 4.4.1、および組み込みデバイス用の 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!!!
}
4

1 に答える 1

2

http://liveworkspace.org/code/273c71cd53111dd8c6aaa54e64c53548など。エラーを取得します。この場合、sendClearMsg 関数でthis->sendClear(info);は、gcc 4.7.1 のコンパイラを使用する必要があります。では、2012 年になった今、なぜ古いコンパイラを使用するのでしょうか。

于 2012-07-14T03:42:16.270 に答える