7

私は署名がこれであるコンストラクタを持っています:

cpuInput (const std::string &label);

実際のコンストラクターは、スーパーコンストラクターを参照する初期化リストを使用するため、次のようになります。

cpuInput::cpuInput (const string &label) : StateMonitor::input(label) { }

クラスは、オブジェクト ファイルとして正常にコンパイルされます。コンストラクターを呼び出すドライバーと一緒にそのファイルをコンパイルすると、次のようになります。

cpuInput *cpu = new cpuInput();

もちろん、次のエラーが表示されg++ます。

demo.cpp:15:31: error: no matching function for call to ‘cpuInput::cpuInput()’
demo.cpp:15:31: note: candidates are:
In file included from demo.cpp:3:0:
input_cpusage/cpuInput.hpp:7:3: note: cpuInput::cpuInput(const string&)

ここで奇妙な部分があります:コンストラクター呼び出しを次のように変更すると:

cpuInput *cpu = new cpuInput("cpu");

他のすべてを同じままにすると、次のようになります。

demo.cpp:15: undefined reference to `cpuInput::cpuInput(std::string const&)'

const string&とまったく同じではないことはstring const&わかっていますが、これは C++ で文字列参照を渡す標準的な方法 (この場合は、const char* からの変換による) だと思っていました。

class A {
    public:
        A (const string &s) : x(s) { cout << x << endl; }
    private:
        const string x;
};

class B : A {
    public:
        B (const string &s) : A(s) { }
};

int main (void) {
    new B("test");
    return 0;
}             

問題を再現しませんが、私には関連する要素と同じように見えます。

では、なぜ一方で g++ は次のように言うのでしょうか。

候補は... cpuInput::cpuInput(const string&)

それからnew cpuInput("string")言う:

` cpuInput::cpuInput(std::string const&) 'への未定義の参照

4

1 に答える 1