2012-07-18 149 views
1

這下面的程序我已經寫了一些測試。運算符重載C++(<<)

class tgsetmap 
{ 
public: 
std::map<std::string,std::string> tgsetlist; 
void operator<<(const char *str1,const char *str2) 
{ 
    tgsetlist.insert(std::map<std::string,std::string>::value_type(str1,str2)); 
} 

}; 


int main() 
{ 

tgsetmap obj; 

obj<<("tgset10","mystring"); 

obj.tgsetlist.size(); 
} 

這將引發編譯錯誤:

「test.cc」,第10行:錯誤:tgsetmap非法數量的參數::操作< <(爲const char,爲const char *)。 「test.cc」,第22行:錯誤:操作「tgsetmap < < const char *」是非法的。 2檢測到錯誤。*

我錯了嗎?

回答

4

您不能強制operator<<在右側採用兩個參數。下面的代碼:

obj<<("tgset10","mystring"); 

不工作與兩個參數的函數調用,但實際上只是使用了,操作。但它可能不是你感興趣的。

如果你需要傳遞兩個參數給<<運算符,你需要把它們換成其他(單個)類型。例如,您可以使用標準std::pair,即std::pair<const char*, const char*>

但請注意,operator<<也應該返回一些適合於<<鏈接的合理類型。你的情況可能是tgsetmap&。下面的版本應該很好地工作:

#include <map> 
#include <string> 
#include <iostream> 

class tgsetmap 
{ 
public: 
    typedef std::map<std::string, std::string> list_type; 
    typedef list_type::value_type item_type; 

    list_type tgsetlist; 

    tgsetmap& operator<<(item_type item) 
    { 
     tgsetlist.insert(item); 
     return *this; 
    } 
}; 

int main() 
{ 
    tgsetmap obj; 

    obj << tgsetmap::item_type("tgset10","mystring") 
     << tgsetmap::item_type("tgset20","anotherstring"); 

    std::cout << obj.tgsetlist.size() << std::endl; 
} 

請注意,我添加類型定義,不必一遍遍重複類型名稱。我也讓operator<<返回一個tgsetmap&,這樣<<可以被鏈接(在上面修改的main()中使用)。最後,我重用了std::map<...>::value_type來簡化它,但您也可以使用其他類型的自己的。


但我相信你可能更喜歡使用常規方法。喜歡的東西:

void add(const char *str1, const char *str2) 
{ 
    tgsetlist.insert(std::map<std::string, std::string>::value_type(str1, str2)); 
} 

(類聲明中),然後輸入:

obj.add("tgset10", "mystring"); 
+0

我確實知道這一點,但我想在這裏使用流操作符。對我來說不是那麼有趣的解決方案。 – Vijay 2012-07-18 09:23:05

+0

前段時間我還添加了'<<'運算符代碼。 – 2012-07-18 09:26:57

+0

謝謝Michal.Learned一個新的東西:) – Vijay 2012-07-19 06:12:59

0

是的。運算符< <是二元運算符。不是三元的。不要忘記這個指針。

1

operator<<一個類的內部必須重載這樣的:

T T::operator <<(const T& b) const; 

如果你想以2個參數重載它,你可以做一個類的外:

T operator <<(const T& a, const T& b); 

我例如,編譯器會爲您發佈的代碼提供更詳細的錯誤消息: enter image description here

如果您不是確定一個操作符重載語法,關於它有一個wiki article

+0

需要清除這些知識,請在相同問題或任何C++好書中加入鏈接 – gaussblurinc 2012-07-18 07:06:45

+0

在這裏您可以找到一本書:http://stackoverflow.com/questions/388242/the-definitive-c-book-指導和列表 – 2012-07-18 07:26:27

+0

在這兩種情況下,<<將採取兩個參數 - 'a << b' a是第一個,b是第二個。如果你已經在課堂上聲明瞭,第一個參數就是隱含的。所以無論如何,你不能讓運營商採取兩個以上的參數。但是你可以做這個'a << b << c'。這是你想要的? – Mohan 2012-07-18 07:54:42

0

如前所述,<<是二元運算符,所以沒有辦法可以採取兩個以上ARGS(一應該是這個,如果你是在課堂內宣佈的話,或者如果你是在課外宣講的話就是LHS)。但是,您可以通過執行obj<<"tgset10". <<"mystring";來完成相同的功能。但由於<<是一個二元運算符,你必須爲此做一些破解。

爲此,我分配了一個靜態變量op_count,其中我將確定它是值還是類型。另一個靜態變量temp_str用於存儲跨調用的先前值。

class tgsetmap 
{ 
    public: 
    std::map<std::string,std::string> tgsetlist; 

    static int op_count = 0; 
    static const char *temp_str; 
    tgsetmap& operator<<(const char *str) 
    { 
     op_count++; 
     if (op_count%2 != 0) { 
      temp_str = str; 
     } 
     else { 
      tgsetlist.insert(std::map<std::string,std::string>::value_type(temp_str,str)); 
     } 
     return this; 
    } 
}; 

所以,你可以做

int main() 
{ 
    tgsetmap obj; 
    obj<<"tgset10"<<"mystring"; 
    obj.tgsetlist.size(); 
} 

或者乾脆你可以使用一些分離器嵌入相同的字符串值和類型,

值:類型=分離是:

value_type =分隔符是_。