當前位置:成語大全網 - 書法字典 - 錯誤C2679:二進制" >;>:未找到接受“const char [5]”類型的右操作數的運算符(或沒有可接受的轉換)。

錯誤C2679:二進制" >;>:未找到接受“const char [5]”類型的右操作數的運算符(或沒有可接受的轉換)。

我用VS2008,VS2010,VS2013,GCC試了壹下,確實是VS2008,VS2010編譯錯誤,但是VS2013編譯成功了(不知道為什麽會成功,從標準庫給出的原型來看,程序應該不會編譯)!

妳把typedef set::const _ iterator CIT;改為typedef set::const _ iterator CIT;可以編譯壹下!

妳的問題問完了,但我還有話要說。如果妳書裏的代碼真的是這樣的,可以直接扔掉。根本不值得看,誤導人,害人。當然,我會告訴妳原因:

原罪壹:

集合模板類定義的原型是

模板& ltclass T,// set::key_type/value_type

class Compare = less,//set::key _ Compare/value _ Compare

class Alloc = allocator//set::allocator _ type

& gt類集;

這裏的第壹個參數是妳要存儲的數據類型,第二個參數和第三個參數是可選的,第二個參數默認為less,是壹個函數對象(重載了括號運算符)其定義如下:

無模板結構:binary_function {

布爾運算符()(const T & ampx,const T & ampy)const { return x & lt;y;}

};

也就是說,less是指使用字符串的小於號作為排序標準(可以改為greater按大於號排序);不說第三個了!

所以typedef set::const _ iterator CIT;嚴格來說,這個東西是不正確的,妳也搞不清楚它要做什麽。作為排序標準,字符串是否大於符號?小於符號?我剛查了壹下,string沒有重載operator(),所以不是函數對象;但是不知道VS2013和G++能不能編譯!

原罪2:

我們來看看這個模板函數的定義,顯然不是面向對象的思維,而是面向過程(C語言)的思維模式。

模板

虛空展(CIT & ampit,set & amps)

{

for(it = s . begin();它!= s . end();++it)

{

cout & lt& lt* it & lt& lt”\ t”;

}

cout & lt& ltendl

}

C++的實踐是怎樣的

模板

無效顯示(常量集& amps)

{

for(typename set::const _ iterator citer = s . begin();citer!= s . end();++citer)

{

cout & lt& lt* citer & lt& lt”\ t”;

}

cout & lt& ltendl

}

我來解釋壹下,函數是輸出集合容器中的每壹個元素。很明顯,只需要傳入壹個參數。為什麽有兩個?太奇怪了。

原罪三:(這部分可以商量)

再看看這段精彩的代碼。

const int N = 5;

string s1[N]={"mick "," bill "," gate "," rose "," Jane " };

String s2[N]={ "張峰","秦萍","李莉","房鹿","胡濤" };

setname 1;

name1.insert(s1,s 1+N);

setname2(s2,S2+N);

首先,這裏定義了兩個臨時數組s1和s2。從這個角度來說,就是使用數組的唯壹初始化列表(C++11標準之後也支持set),但是從這個例子中我們看不到這樣使用的好處!

而且name1和name2的構造方法不同(第壹個使用默認構造函數+插入成員函數,第二個使用特定的構造函數),這在現在這個程序中顯然很難解釋。

更合適的方法是:

集合名稱1;

name 1 . insert(" Mick ");

name 1 . insert(" bill ");

name 1 . insert(" gate ");

name 1 . insert(" rose ");

name 1 . insert(" Jane ");

集合名稱2;

Name2.insert("張峰");

Name2.insert("秦萍");

name 2 . insert(" Lili ");

Name2.insert("房鹿");

Name2.insert("胡濤");

壹目了然,所以有人可能會說,元素多了,這樣的代碼就難看了,妳其實應該把這些字符串放到壹個文件裏,然後由程序讀取,用insert插入到集合裏。

原罪4:

cout & lt& lt找出name2中大於“Li Li”的第壹個元素。\ n ";

cit = name 2 . upper _ bound(" Li Li ");

cout & lt& lt*cit<。& ltendl

Set在英語中是按照字典順序排序的,而漢字不是很確定。例如,在linux下運行G++的結果是:

查找name2中大於的第壹個元素。

秦萍

註:第二名的順序是:張峰、李莉、秦萍、胡濤和房鹿(非拼音順序)。

而在windows下用VS運行的結果是:

查找name2中大於的第壹個元素。

房鹿(按拼音順序)

所以這裏根本不用漢字做例子,用英文單詞也不會有異議!

原罪五:

整個程序的排版、縮進、標準化都很差。壹看都是業余的,還是很久以前的C++代碼。我特意安排的。讓我們來看看:

#包括

#包括

#包括

使用命名空間std

模板

無效顯示(常量集& amps)

{

for(typename set::const _ iterator citer = s . begin();citer!= s . end();++citer)

{

cout & lt& lt* citer & lt& lt”\ t”;

}

cout & lt& ltendl

}

int main()

{

設置名稱;

names . insert(" Mick ");

names . insert(" bill ");

names . insert(" gate ");

names . insert(" rose ");

names . insert(" Jane ");

cout & lt& lt"輸出每個元素的名稱:"

顯示(姓名);

cout & lt& lt"查找名稱中大於或等於的第壹個元素."

set::const _ iterator cit = names . lower _ bound(" x-men ");

如果(cit!= names.end()) {

cout & lt& lt*cit <。& ltendl

}否則{

cout & lt& lt抱歉,找不到大於或等於的元素

}

返回0;

}

1,刪除了#include

2.重寫顯示模板函數。

3.名稱2已刪除,名稱1已更改為名稱。

4.使用多次插入,而不是數組加插入。

5.嘗試使用endl而不是" \n "

6.使用const_iterator而不是iterator,因為它的值不被修改。

7.判斷cit的返回值,就像程序裏寫的壹樣,找不到也能正確處理;原程序找不到就掛了。

8、合理使用空格和換行符,使節目美觀有條件。

如果妳能看懂,推薦妳讀壹本好書,《C++初級讀本》。