2012-12-05 2 views
2

암시 적 변환을 시도했지만 작동하지 않습니다.MyClass를 std :: string의 연산자와 함께 사용하는 방법 +

#include <string> 
#include <iostream> 

struct MyClass 
{ 
    operator std::string() { return "bar"; } 
}; 

int 
main(int argc, char* argv[]) 
{ 
    MyClass x; 

    std::cout << std::string("foo") + x << std::endl; 
    return 0; 
} 
+2

문자열의 '연산자 +'는 템플릿이므로 암시 적 변환은 작동하지 않습니다. – Pubby

+0

@Pubby 당신은 그 대답을해야합니다! – juanchopanza

+0

+1 @Pubby 나는 동의한다! 자세한 설명은 우리 모두가 C++를 더 잘 이해하는 데 도움이 될 것입니다. – kfmfe04

답변

4

문자열의 operator+이 (가) 템플리트되어있어 템플릿 매개 변수를 추론하므로 암시 적 변환이 작동하지 않습니다. 이것은 무슨 일이 일어나고 있는지에 대한 더 나은 설명처럼 보입니다 : https://stackoverflow.com/a/8892794/964135

나는 캐스팅을하거나 템플릿이 아닌 operator+으로 작성합니다.


멍청한 솔루션 유형을 추론하지 않는 것입니다 후가 암시 적 변환 할 것입니다 : KARTHIK T와 Pubby에 의해 주어진 좋은 답변을

std::cout << std::operator+<char, std::char_traits<char>, std::allocator<char> >(std::string("foo"), x) << std::endl; 
2

+ 연산자에 과부하를 시도 했습니까?

std::string operator+(std::string& str, MyClass& x){ 
    return str + "bar" 
} 

이것은 무료 기능이며 MyClass의 일부가 아닙니다. 또한 교환 가능 케이스에도 과부하가 필요할 수 있습니다. 문제가 없다면 위의 내용으로 표현할 수 있습니다.

1

operator+() 과부하에 대한을, 나는 싶습니다 한 점 더하기.

보통 operator+() 코드 (return "bar";과는 달리)가 포함 된 MyClass의 개인 회원에 액세스해야합니다. 이 경우 friend으로 신고해야합니다. MyClass+ 연산자의 왼쪽에 있으므로 operator+()MyClass의 구성원으로 사용할 수 없습니다. 아래 샘플 코드를 참조하십시오.

#include <string> 
#include <iostream> 
using namespace std; 

struct MyClass { 
public: 
    MyClass() : bar("bar") {} 
    friend string operator+(string& str, MyClass& x); 
private: 
    string bar; 
}; 

string operator+(string& str, MyClass& x) { 
    return str + x.bar; 
} 

int main(int argc, char* argv[]) 
{ 
    MyClass x; 
    string foo("foo"); 

    std::cout << foo + x << std::endl; 
    return 0; 
} 
관련 문제