RHEL 6.0两段相似的代码:一个能编译,一个不能

RHEL 6.0 Two Similar Pieces of Code: One Compiles One Does Not

本文关键字:一个 不能 编译 0两 段相似 RHEL 相似 代码      更新时间:2023-10-16

谁能解释一下为什么上面的代码不能编译而下面的代码可以?

#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;
//}

,

[mehoggan@hogganz400 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

编译器认为myset是一个函数声明。查找"最令人烦恼的解析"。我总是在使用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);

它将你的"myset"声明解释为一个函数。

还有:对于字符串,你需要istream_iterator,而不是istreambuf_iterator:

set<string> myset((istream_iterator<string>(testFile)), (istream_iterator<string>()) );
相关文章: