2011-12-14 28 views
2

有人可以解释为什么最上面的代码不会编译,最底层的代码会不会?RHEL 6.0两个类似的代码片断:一个编译一个不会

#include <iterator> 
#include <iostream> 
#include <set> 
#include <string> 
#include <fstream> 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    ifstream testFile; 
    testFile.open("opengl_functions", ios::in); 
    set<string> myset(istreambuf_iterator<string>(testFile), istreambuf_iterator<string>()); 

    set<string>::iterator it; 

    for (it = myset.begin(); it != myset.end(); ++it) { 
    } 
} 

//using namespace std; 
// 
//int main() 
//{ 
// int myints[] = {75,23,65,42,13}; 
// set<int> myset (myints,myints+5); 

// set<int>::iterator it; 

// cout << "myset contains:"; 
// for (it=myset.begin() ; it != myset.end(); it++) 
// cout << " " << *it; 

// cout << endl; 

// return 0; 
//} 

-

[[email protected] opengl_parser]$ make 
g++ -o parser -Wall ./parser.cpp 
./parser.cpp: In function ‘int main(int, char**)’: 
./parser.cpp:17: error: request for member ‘begin’ in ‘myset’, which is of non-class type ‘std::set<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(std::istreambuf_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::char_traits<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::istreambuf_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::char_traits<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > (*)())’ 
./parser.cpp:17: error: request for member ‘end’ in ‘myset’, which is of non-class type ‘std::set<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(std::istreambuf_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::char_traits<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::istreambuf_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::char_traits<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > (*)())’ 
make: *** [parser] Error 1 
+0

您可以发布编译错误? – 2011-12-14 01:58:16

回答

3

你的编译器认为,MYSET是一个函数声明。查找"the most vexing parse"。我总是用istream迭代器来运行它,所以我总是事先声明它们。作为一个附带的好处,我觉得更容易阅读:

std::istreambuf_iterator<string> begin(testFile), end; 
std::set<std::string> myset(begin, end); 

不过,我不相信会编下去,但出于不同的原因。 istreambuf_iterator只能在字符类型上模板化。您将需要使用istream_iterator。

std::istream_iterator<string> begin(testFile), end; 
std::set<std::string> myset(begin, end); 
+0

你有一个括号问题 – 2011-12-14 02:18:04

+0

我做了,我忍者编辑它。 – 2011-12-14 02:19:59

2

它将您的“myset”声明解释为函数。

另外:对于字符串,你需要istream_iterator,不istreambuf_iterator:

set<string> myset((istream_iterator<string>(testFile)), (istream_iterator<string>())); 
相关问题