2013-03-26 2 views
4

누군가가 왜 이것이 작동하지 않는지 말해 줄 수 있습니까? 나는 C++이 값에 의한 리턴 값 결과의 참조를 생성자에 자동으로 전달한다는 인상하에 있었지만, 일치하는 연산자가 없다고 불평했다.C++ 연산자를 찾을 수 없음

class bucket_string { 
     public: 
      bucket_string(); 
      bucket_string(bucket_string & rhs); 
      bucket_string & operator=(bucket_string & rhs); 
      virtual ~bucket_string(); 

      bucket_string substr(iterator start, iterator end){ 
         bucket_string b(str); 
         return b; 
        } 
}; 



bucket_string bs("the quick brown fox jumps over the lazy dog"); 
bucket_string bs1 = bs.substr(bs.begin(), bs.end()); 

다음과 같은 오류를 반환

error: no matching function for call to ‘bucket_string::bucket_string(bucket_string)’ 
note: candidates are: bucket_string::bucket_string(bucket_string&) 
     bucket_string::bucket_string() 
+4

'bucket_string :: bucket_string (const char *)'과 일치하지 않는다는 오류 메시지가 표시되지 않는다는 것에 놀랐습니다. 이 코드가 완전한 코드입니까? 또한,'iterator'가 선언 된 곳은 어디입니까? –

+0

아니요 - 대부분의 내용을 쉽게 읽고 질문에 대답 할 수 있도록 제거했습니다 :-) – Supremacy

+0

예제 코드는 최소한으로 완벽해야하며 보여주는 오류는 실제로 가지고있는 코드에서 가져와야합니다 귀하의 질문에 당신이 보여주지 않은 다른 코드가 아닙니다. 이렇게하면 질문에 답하는 것이 실제 문제를 해결할 수있는 기회가됩니다. –

답변

7

이 임시 값 const가 아닌 참조에 결합 될 수 없다.

bucket_string substr(iterator start, iterator end) 함수는 임시를 반환하고 생성자/할당 연산자가 비 const 참조를 매개 변수로 사용하므로 문제가 발생합니다.

따라서 생성자 및 할당 연산자에 누락 된 const 지정자를 추가해야합니다. 좋아요 :

bucket_string(const bucket_string& rhs); 
bucket_string& operator=(const bucket_string& rhs); 

더 나은 이해를 위해 여기에 interesting discussion이 있습니다.

참고로 C++ 11이 옵션 인 경우 클래스를 이동 가능하게 만들 수도 있습니다. 이렇게하면 임시 인스턴스의 내부 자원을 다른 인스턴스로 전송할 수 있습니다. 우리는 상황에서 좋은 일이 될 것이라고 말하는 맥락이 부족합니다.

그런 다음 그 메소드를 구현해야합니다 :

bucket_string(bucket_string&& other); 
bucket_string& operator=(bucket_string&& other); 
+0

@ 투샤 르 : 흠 ... 뭐라구? – ereOn

+0

그 링크에서 그 대답은 다소 더 명확 해졌습니다. – Supremacy

+0

@Supremacy : 기꺼이 도와 드리겠습니다. – ereOn

6

일부 const를 넣습니다.

bucket_string(const bucket_string & rhs); 
       ^^^^^ 
bucket_string & operator=(const bucket_string & rhs); 
          ^^^^^ 

임시 const 값을 생성자에 전달하고 있습니다. 컴파일러 const 참조 accpets 생성자를 검색 :

C++에서
bucket_string bs("the quick brown fox jumps over the lazy dog"); 
+7

왜'const를 넣어야하는지 '를 설명해야합니다. "const 값 전달"이 아닙니다. – juanchopanza

+1

temporaries를 non-const 참조에 바인딩 할 수 없다는 점을 언급 할만한 가치가 있습니다. – ereOn

+0

정확하게 "어딘가에 어딘가에 const를두면 도움이 될 것" – 4pie0

1

코드가 작동하지 않는 방식으로 값과 참조 의미를 혼합합니다. substr은 값으로 반환하지만 생성자는 비 const 참조로 매개 변수를 사용합니다. 상수가 아닌 것은 매개 변수가 순수 값이 아닌 수정 가능한 객체로 취급됨을 나타냅니다. 언어는 이러한 방식으로 참조를 사용하는 것을 금지합니다. 그것의 인수를 수정할 수 있도록 할당 연산자를 조정 : C++ (예 : 함수 반환 값으로) 임시 객체가 const 참조를 통해 전달 될 수 있기 때문에

 bucket_string & operator=(bucket_string const & rhs); 

이 작동합니다.

실제로 할당 연산의 소스를 수정하려는 경우 C++은 rvalue 참조에서 솔루션을 제공합니다. const & 대신 &&을 사용하십시오. 그러나 할당은 더 이상 멱등수가 아니기 때문에 이라는 지정을 이동이라고하고 - 현대 개체를 사용하는 경우 대체 구문이 필요합니다.