私は署名がこれであるコンストラクタを持っています:
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&) 'への未定義の参照