0

非常にトリッキーな C++ コンパイラ エラーが発生しました。

引数として使用する文字列を作成すると、通常のメソッドを呼び出すときに機能します。例えばprintThisString(string(charPtr));

コンストラクターへの引数がchar*. たとえばMyObject a(string(argv[0]));、引数がリテラルの場合でも機能します。例えば、MyObject b(string("hi"));

#include <iostream>
#include <string>

using namespace std;

void printString(string toPrint) {
    cout << toPrint << endl;
}

class MyObject {
    int blah;
public:
    void aMethod() {}
    MyObject (string myStr) {
        cout << myStr << endl;
    }
};

int main(int argc, char ** argv) {

string s1(argv[0]);
char * s2 = "C-style string"; // I realize this is bad style

printString(string("Hello world!")); // All of these work
printString(s1);
printString(string(s2));
printString(string(argv[0]));

MyObject mo1 (string("Hello world!")); // Valid
MyObject mo2 (s1); // Valid
MyObject mo3 (string(s2)); // Does not print
MyObject mo4 (string(argv[0])); // Does not print

mo1.aMethod();
mo2.aMethod();
mo3.aMethod(); // Error
mo4.aMethod(); // Error


return 0;
}

mo3 と mo4 の場合、オブジェクトは作成できますが、メソッドは使用できません。彼らは間違ったタイプです。コンパイラはそれらが関数であると考えているようです...

test.cpp: In function 'int main(int, char**)':
test.cpp:22:13: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
test.cpp:36:5: error: request for member 'aMethod' in 'mo3', which is of non-class type 'MyObject(std::string) {aka MyObject(std::basic_string<char>)}'
test.cpp:37:5: error: request for member 'aMethod' in 'mo4', which is of non-class type 'MyObject(std::string*) {aka MyObject(std::basic_string<char>*)}'
4

1 に答える 1