2010-10-10 55 views
1

我有抽象類:超載二進制+

#include <string> 

using namespace std; 

class AString 
{ 
    public: 
     virtual ~AString() {} 

     virtual const string& GetName() const = 0; 
     virtual const string& GetValue() const = 0; 
     virtual const int GetSize() const = 0; 
}; 

和衍生類。我嘗試過載二元+在這個類:

class SymbString : public AString 
{ 
    private: 
     string name; 
     string val; 

    public: 
     SymbString() {} 

     SymbString(string _name) : name(_name) {} 

     SymbString(string _name, string _val) : name(_name), val(_val) {} 

     const string& GetName() const { return name; } 

     const string& GetValue() const { return val; } 

     const int GetSize() const { return val.size(); } 

     const string& SetValue(string value) 
     { 
      val = value; 
      return val; 
     } 

     SymbString operator + (const SymbString &str1, const SymbString &str2) 
     { 

     } 

}; 

但看到錯誤:SymbString運營商+(常量SymbString & STR1,常量SymbString & STR2)必須採取零個或一個參數

什麼問題?

謝謝。

回答

2

您需要將它放入SymbString的封閉名稱空間中。不作爲成員。

或作爲成員,但只有指定正確的參數。但之後"Hello" + symb將不再工作,因爲左側不是SymbString。因此,建議在SymbString的名稱空間中將其作爲非成員編寫。

需要注意的是要能夠symb + "Hello"或周圍的其他方法,甚至寫SymbString s = "Hello";,還需要接受char const*作爲構造函數的參數。否則,char const*將不會隱式轉換爲SymbString,因爲這需要先轉換爲std::string,然後再轉換爲SymbString。兩個此類用戶定義的轉換不允許在單個隱式轉換序列中。

+0

是的,它在SymbString中,我寫在stackoverflow這樣的易懂性 – 0xAX 2010-10-10 14:17:33

2

您正在將其定義爲實例方法。這意味着左操作數將是接收器(this),右操作數將是該函數的參數。

如果您希望兩個操作數都是參數,則需要將方法定義爲靜態方法,或者將其定義爲類外部的函數。

1

我猜你試圖引入operator+作爲該類的成員函數。這是錯誤的。將其定義爲一個自由函數。或者有operator+=作爲會員,並通過該功能實現免費功能operator+