2013-07-19 1 views
1

Windows에서 Visual C++로 개발 한 다음 g ++을 사용하여 Linux에서 컴파일하기 때문에 몇 가지 문제가 발생합니다. 내가 이해 못하는 한가지는 g ++이 함수에 생성자에 대한 참조를 전달하면 일치하는 데이터 유형이 함수에 전달되지 않는 것입니다. 그것은 다음과 같이 호출되면g ++는 Visual C++과 달리 별도의 줄에 선언하지 않으면 데이터 형식을 유추 할 수 없습니다.

static int to_int(string& value); 

:

:

int id_number = EZXMsg::to_int(string(tokens[index])); 

g ++ (여기서 유형은 vector<char*>& tokens 인 토큰) 오류를 범 특히, 이런 방법은 서명을 주어진

main.cpp:130: error: no matching function for call to 'ezx::iserver::EZXMsg::to_int(std::string)' ../iserver-api/ezxmsg.h:50: note: candidates are: static int ezx::iserver::EZXMsg::to_int(std::string&)

Visual C++에는 컴파일하는 데 문제가 없습니다. g의 ++을 위해 문제를 해결하려면 코드는 다음과 같이 할 필요가 :

string value(tokens[index]); 
int roid = EZXMsg::to_int(value); 

추가적인 라인을 필요로 g 이유는 ++ 무엇입니까?

답변

8

임시가 아닌 참조로 임시 변수를 바인딩하려고합니다. 이것은 표준 C++에서는 허용되지 않습니다. 당신이 것, 당신이 정말로 (A to_int 기능이 필요하지 않을 것입니다) 함수의 내부 문자열을 돌연변이해야하는 경우

static int to_int(const string& value); 
//    ^^^^^ const reference: yes yes! 

:

static int to_int(string& value); 
//    ^^^^^^^ non-const reference 

int id_number = EZXMsg::to_int(string(tokens[index])); 
//        ^^^^^^^^^^^^^^^^^^^^^^ temporary string: no no! 

가장 가능성이 솔루션은 const 참조를 전달하는 것입니다 그래서

auto s = string(tokens[index]); 
int id_number = EZXMsg::to_int(s); // OK, s is not a temporary 
+2

당신은 마이크로 소프트가 표준 아니라고하려는 : 비 const를 참조를 복용 함수에 비 임시 문자열을 전달해야? :) –

+5

@SamGoldberg, 예. 확장 기능은 컴파일러 스위치를 통해 비활성화 할 수 있습니다 ([언어 확장 비활성화] (http://msdn.microsoft.com/en-us/library/0k0w269d%28v=vs.110%29.aspx) 참조). – hmjd

+0

변경 사항을 알려 드리겠습니다. 이제는 설명해 봤으면 좋겠다. 좋은 명확한 설명 (특히 나와 같은 초보자를위한)! –

관련 문제