2011-12-14 25 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>())); 
相關問題