2012-01-29 73 views
2

有人能告诉我为什么我得到:“非法使用这种类型的表达式:std :: string”与for循环?据我所知,一切都应该正确设置。我试图遍历矢量中的字符串并检查每个字符串成员的大小写(尽管我真的只对第一个字符串感兴趣,因此排序算法不会将大写单词与小写字母分开......)std ::向量上的字符串错误<string> ::迭代器

/* BiasedSort: accepts vector<string> by REFERENCE and sorts the vector lexographically, except that if the vector 
* contains "Me First", that string is always at the front. 
*/ 

#include <string> 
#include <vector> 
#include <iostream> 
#include <algorithm> 
#include <iterator> 
using namespace std; 

// getting error on the "for" line. 
void ConvertToLower (vector<string> &vector) 
{ 
    for (vector<string>::iterator iter = vector.begin(); 
     iter != vector.end(); ++iter) { 
      string iterString = *iter; 
      transform(iterString.begin(), iterString.end(), iterString.begin(), ::tolower); 
    } 
} 

void BiasedSort (vector<string> &vector) 
{ 
    ConvertToLower(vector); 
    sort(vector.begin(), vector.end()); 

} 

int main() 
{ 
    vector<string> myVector; 
    myVector.push_back("this"); 
    myVector.push_back("string"); 
    myVector.push_back("and"); 
    myVector.push_back("vector"); 
    myVector.push_back("are for"); 
    myVector.push_back("testing"); 
    myVector.push_back("purposes"); 
    copy(myVector.begin(), myVector.end(), ostream_iterator<string>(cout, " ")); 
    cout << endl; 

    BiasedSort(myVector); 

    copy(myVector.begin(), myVector.end(), ostream_iterator<string>(cout, " ")); 
    cout << endl; 

    system("pause"); 
    return 0; 
} 
+0

出于好奇,你是否正在使用CS106L课程阅读器进行练习?如果是这样,你发现它们有多有用? – templatetypedef 2012-01-29 07:34:49

+1

'滥用命名空间标准;'只是说不。 – 2012-01-29 07:35:05

+0

1.是的,我正在练习CS106L以外的练习。实验室很棒。比类更具体的C++。强烈推荐。 2.我知道我知道,命名空间std滥用...给我打电话newb ...有趣。 – MCP 2012-01-29 07:38:59

回答

3

我认为,这里的问题是,你命名的参数vector

void ConvertToLower (vector<string> &vector) 
{ 
    for (vector<string>::iterator iter = vector.begin(); /* ... */ 

因此,编译器处理行

vector<string>::iterator 

((vector < string) > (::iterator)) 

即,比较vectorstring的表达式,并且该结果以::iterator

要解决此问题,请尝试将该参数重命名为该函数,以便您不命名参数vector。或者,您可以完全限定类型std::vector以明确指出您正在创建std::vector<string>::iterator,而不是执行涉及参数vector的某个表达式。

希望这会有所帮助!

0

编辑:您不应该使用名称vector作为此函数中的标识符。

+0

@templatetypedef:这就是我的意思。有点。不应该。在这个特定的功能。 – kkm 2012-01-29 07:51:27