2012-12-05 56 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

由於字符串的'operator +'是模板化的,隱式轉換將不起作用。 – Pubby

+0

@Pubby你應該做出答案! – juanchopanza

+0

+1 @Pubby我同意!詳細的解釋會幫助我們更好地理解C++ – kfmfe04

回答

4

隱式轉換將不起作用,因爲字符串的operator+是模板化的,並且您正在推導模板參數。這看起來像是更好的解釋發生了什麼:https://stackoverflow.com/a/8892794/964135

我只是做一個演員或寫一個非模板operator+


愚蠢的解決方案是不推斷類型,然後它會做隱式轉換:

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

要通過KARTHIK T和Pubby給出很好的回答關於超載operator+(),我想加一點。

通常情況下,您需要訪問MyClass的私人成員,才能在超載的operator+()代碼中使用(與return "bar";不同,就像在大概精簡的示例中一樣)。在這種情況下,您需要將其聲明爲friend。您不能將operator+()作爲MyClass的成員,因爲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; 
} 
相關問題