2011-01-19 11 views
2

내 함수 선언은
입니다. siteObject(std::string& url, std::string& get, std::string& post);문자열 대신 문자 배열을 보내려고하는 이유는 무엇입니까?

site("String 1", "String 2", "String 3")입니까? 불일치 유형 오류가 발생합니다. 문자열 참조가 필요하고 char 배열을 받고 있다고합니다. 더 자세한 내용이 필요하면 의견을 물어보십시오.

+0

Long story short : C 디자이너는 string literak 유형'char []'을 만들었습니다. C++ 디자이너는 C++을 C와 호환 가능하게 만들었으며 모든 C++ 프로그래머에게 당신을 포함하여이 모든 것을 포함하여 귀찮은 번거 로움을주었습니다. – delnan

답변

6

std::string 생성자에 대한 암시 적 호출이 있으므로 임시 개체가 만들어집니다. 임시가 아닌 임시 참조를 참조 할 수는 없습니다 (임시 수정이 의미가 없으므로).

따라서 함수를 수정하여 const 참조 또는 by-value를 가져 오거나 비 임시 대상으로 전달하십시오.

+0

이이를 수행하는 유일한 방법입니까? – Will03uk

+3

MSVC보다 표준에 맞는 컴파일러에서는 작동하지 않습니다. 임시 객체를 const가 아닌 참조로 전달하려고하기 때문에. – mmmmmmmm

+0

@ Will03, 당신은'siteObject (const std :: string & url, const std :: string & get, etc.)처럼 프로 시저를 작성할 수 있습니다. ' – Muggen

1

올바른 호출은 다음과 같습니다 메소드 서명이 다시 세 개의 문자열 (const가 아닌 참조)에서 무언가를 얻을 것을 의미하고 그 반환 값을 사용할 수 있기 때문에

std::string url("..."); 
std::string get("..."); 
std::string post("..."); 

siteObject(url, get, post); 

이 의미가 있습니다.

즉 의도하지 그리고 당신은 당신이해야 siteObject() 메소드를 변경할 수있는 경우 :

siteObject(std::string const & url, std::string const & get, std::string const & post); 

을하고 원래 통화를 사용합니다.

+0

그 질문에 대답하지 못했습니다 ?? – Will03uk

+0

@ Will03Uk : 네 말이 맞아 ... – mmmmmmmm

+0

@ Will03Uk : 대답이 업데이트되었습니다! – mmmmmmmm

3

귀하의 siteObject 기능 :

siteObject(std::string& url, std::string& get, std::string& post); 

이 우변 (또는 임시직)에 바인딩 할 수 없습니다 문자열 객체에 const가 아닌 참조를합니다.

문자열 리터럴로 함수를 호출 할 때 컴파일러는 해당 인수 (char*)를 매개 변수 유형과 일치하는 것으로 변환해야합니다. 즉, 변환 결과는 임시 std::string 개체가됩니다.

당신이 임시직에 결합 할 수 있도록하려면 당신은 const를 참조를 허용하도록 기능을 변경해야합니다 :

siteObject(std::string const& url, std::string const& get, std::string const& post); 

아니면 참조 대신 값을 전달할 수 :

siteObject(std::string url, std::string get, std::string post); 
1

함수가 const std::string& str을 수락하도록 허용하거나 전달할 문자열 인스턴스를 구성하고 char *을 문자열 객체로 암시 적으로 변환하지 말아야합니다.

0

큰 따옴표 문자로 입력 된 문자열은 C++의 C 유실 (C 문자열 또는 NUL 종료 문자열)에서 나옵니다. 그들은 char 배열로 컴파일러에 의해 구현됩니다. 반대로 std::string은 문자열 조작을 단순화하는 것을 목표로하는 C++ 클래스입니다. 그것은 C 문자열을 소유하며 (const char*을 수락하는 생성자를 가졌기 때문에 C 문자열을 소유하고 생성 할 수 있으며 해당 메모리를 관리합니다.

const char*에서 std::string의 construtor가 있고 그 C 문자열이 해당 유형과 호환 가능하므로 컴파일러가이 함수를 호출 할 수없는 이유는 무엇입니까? 이것은 함수가 std::string 객체에 대한 비 const 참조를 취하기 때문입니다.생성 된 객체가 임시 객체가 될 것이므로 생성자는이 상황에서 사용할 수 없으며 임시 객체에 대한 비 const 참조를 얻을 수 없습니다. 호출 된 함수가이를 변형 할 수 있기 때문입니다.

당신은 std::string를 생성하고 함수에 전달할 수 있습니다 :

std::string s1("String 1"); 
std::string s2("String 2"); 
std::string s3("String 3"); 
site(s1, s2, s3); 

을 또는 당신은 const를 참조를 허용하도록 site 함수의 프로토 타입을 변경할 수 있습니다. 이것은 함수가 객체를 변경시키지 않고 코드에 액세스 할 수있는 경우에만 가능합니다.

// Declaration 
void site(const std::string& s1, const std::string& s2, const std::string s3); 

// Usage 
site("String 1", "String 2", "String 3"); 
관련 문제