RHEL 6.0两段相似的代码:一个能编译,一个不能
RHEL 6.0 Two Similar Pieces of Code: One Compiles One Does Not
谁能解释一下为什么上面的代码不能编译而下面的代码可以?
#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>()) );
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 不能将方法返回的值用于另一个方法
- 为什么我不能在主函数之外定义一个类的对象(它继承了另一个类)?
- 为什么一个简单的程序不能立即启动
- 为什么我不能从同一目录中的另一个文件中 #include 我的类?
- 为什么我不能创建一个 TSubclassOf<> 在 SpawnActor() 函数中使用?
- WINUSB_ControlTransfer只能在设备上可用的两个接口中的一个上使用,而不能在另一个接口上使用
- 为什么我不能声明一个 constexpr 本地,而一个 const 一个工作?
- 链表指针赋值为什么我们不能直接将尾巴分配给 temp 而不是尾巴>尾巴下一个
- 可以访问一个类中的播放器结构,但不能访问另一个类中的播放器结构
- 派生类不能用另一个基类的成员重载基类中的私有成员
- 不能 std::cout 一个max_element函数
- 如果静态变量只为程序的整个部分存储了一个副本,为什么我不能使用静态变量交换 2 个数字?
- 一个对象什么时候可以有非零大小的一个,但不能同时具有一个或多个字节的存储
- RHEL 6.0两段相似的代码:一个能编译,一个不能
- 两个值的最大值,其中一个不能等于预定义值
- 如何创建一个不能被其他类继承的类
- 为什么c++编译器允许将一个不能为constexpr的函数声明为constexpr ?