2013-10-03 2 views
0

매우 까다로운 C++ 컴파일러 오류가 발생했습니다. 일반 메서드를 호출 할 때 std :: string Constructed in Arguments

내가 인수로 사용할 수있는 문자열을 만들

, 그것은 작동합니다. 예 : printThisString(string(charPtr));

생성자에 대한 인수가 char* 인 경우 객체를 생성 할 때 작동하지 않습니다. 예 : MyObject a(string(argv[0])); 인수가 리터럴 인 경우에도 작동합니다. 예를 들어, MO3 MyObject b(string("hi")); 및 MO4 들어

#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; 
} 

, 객체가 생성 될 수 있지만, 어떤 방법을 사용할 수 없다. 그들은 틀린 타입이다.

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>*)}' 
+2

에 오신 것을 환영합니다 C에 ++, 가장 골치 아픈 구문 분석의 가정을 사용하여 문제를 해결할 수 있습니다. – chris

+0

C++ 11을 지원하는 컴파일러를 사용 하시겠습니까? – goji

+0

이 때문에'Type variable = ...;'선언문을 선호해야합니다. 할당이 생략되어 '변수 유형 (...);과 모호성을 뺀 것과 동일한 결과가 나타납니다. (생성자가'explicit'이 아니라고 가정하면,'Type variable = Type (...); '이라고 써야하지만 같은 코드를 다시 생성해야합니다.) – syam

답변

1

이것은 most vexing parse 단지 변형입니다 ... 컴파일러가 함수입니다 생각하는 것으로 나타납니다 mo3mo4는 함수 선언이 아닌 객체 정의입니다. 당신은

MyObject mo3 {string(s2)}; 
MyObject mo4 {string(argv[0])}; 

또는

MyObject mo3 ((string(s2))); 
MyObject mo4 ((string(argv[0]))); 

또는

MyObject mo3 = MyObject(string(s2)); 
MyObject mo4 = MyObject(string(argv[0])); 

또는 ...

+0

또는'MyObject mo2 (static_cast (s2));'. 그러나'string (s2)'와 같은 함수 스타일의 C 캐스트를 반대하는 것은 너무 편치 않습니까? ;-) –

+0

그건 의미가 있습니다. 나는 아직도이 객체들에 대해 이것이 정확히 어떻게 작동하는지 궁금해한다. mo4는 MyObject 인스턴스를 반환하는 함수가되지만 인수는 무엇입니까? g ++은 그것의 유일한 인자가'string *'이라고 말하지만'string (argv [0])'은 어떤 타입을 가질 수 있습니까? – user2503216

+0

@ user2503216 : 위 질문에 대한 내 의견을 참조하십시오. 매개 변수 목록에서'string (argv [0])'은'string argv [0]'과 동일합니다. 이것은'string * argv'와 같은 의미를 갖는 유효한 매개 변수 선언입니다. –

관련 문제