2011-07-16 65 views
4

很多时候我在互联网上找到有用的代码示例。大约有一半时间他们没有指定要包含什么文件,甚至没有指定包含在命令行中使用-l的库。你通常如何发现?C++要包含哪些文件和库?

编辑提示:以下问题已解决。这篇文章的其余部分可以跳过。

现在,我得到吨的错误,而试图编译:

53: string Gunzip::gunzip(string& compressed) 
54: { 
55: namespace io = boost::iostreams; 
56: 
57: io::filtering_istream gunzip; 
58: gunzip.push(io::gzip_decompressor()); 
59: std::istringstream in_stream = std::istringstream(compressed); 
60: gunzip.push(in_stream); 
61: 
62: stringstream strstream; 
63: io::copy(gunzip, strstream); 
64: return strstream.str(); 
65: } 

在互联网上一整天后我想:

option: 3 -L/usr/include/boost 
and: 
8: #include <string> 
9: #include <iostream> 
10: #include <sstream> 

15: #include <boost/iostreams/copy.hpp> 
16: #include <boost/iostreams/device/array.hpp> 
17: #include <boost/iostreams/device/back_inserter.hpp> 
18: #include <boost/iostreams/filter/gzip.hpp> 
19: #include <boost/iostreams/filter/test.hpp> 
20: #include <boost/iostreams/filtering_stream.hpp> 

我的错误是:

    from /usr/include/c++/4.5/string:45, 
       from Gunzip.cpp:8: 
/usr/include/c++/4.5/bits/ios_base.h: In copy constructor  ‘std::basic_ios<char>::basic_ios(const std::basic_ios<char>&)’: 
In file included from /usr/include/c++/4.5/bits/localefwd.h:43:0, 
/usr/include/c++/4.5/bits/ios_base.h:785:5: error: ‘std::ios_base::ios_base(const  std::ios_base&)’ is private 
/usr/include/c++/4.5/iosfwd:77:11: error: within this context 
/usr/include/c++/4.5/iosfwd: In copy constructor  ‘std::basic_istringstream<char>::basic_istringstream(const  std::basic_istringstream<char>&)’: 
/usr/include/c++/4.5/iosfwd:97:11: note: synthesized method  ‘std::basic_ios<char>::basic_ios(const std::basic_ios<char>&)’ first required here 
/usr/include/c++/4.5/streambuf: In copy constructor  ‘std::basic_stringbuf<char>::basic_stringbuf(const std::basic_stringbuf<char>&)’: 
/usr/include/c++/4.5/streambuf:773:7: error: ‘std::basic_streambuf<_CharT,  _Traits>::basic_streambuf(const std::basic_streambuf<_CharT, _Traits>::__streambuf_type&)  [with _CharT = char, _Traits = std::char_traits<char>, std::basic_streambuf<_CharT,  _Traits>::__streambuf_type = std::basic_streambuf<char>]’ is private 
/usr/include/c++/4.5/iosfwd:93:11: error: within this context 
/usr/include/c++/4.5/iosfwd: In copy constructor  ‘std::basic_istringstream<char>::basic_istringstream(const  std::basic_istringstream<char>&)’: 
/usr/include/c++/4.5/iosfwd:97:11: note: synthesized method  ‘std::basic_stringbuf<char>::basic_stringbuf(const std::basic_stringbuf<char>&)’ first  required here 
Gunzip.cpp: In member function ‘std::string Gunzip::gunzip(std::string&)’: 
Gunzip.cpp:59:65: note: synthesized method  ‘std::basic_istringstream<char>::basic_istringstream(const std::basic_istringstream<char>&)’ first required here 
make[2]: Leaving directory `/home/albert/NetBeansProjects/Arb3' 
make[1]: Leaving directory `/home/albert/NetBeansProjects/Arb3' 
make[2]: *** [build/Debug/GNU-Linux-x86/Gunzip.o] Error 1 
make[1]: *** [.build-conf] Error 2 
make: *** [.build-impl] Error 2 

BUILD FAILED (exit value 2, total time: 9s) 

我可以删除前3个包含获取其他错误我不明白。我不知道哪些错误更好。

  1. 此错误是否包含?我应该怎么知道?我在指责包括,因为迄今为止所有的错误都是由于包括。我不知道basic_ios是什么。
  2. 你如何找出包含什么和使用哪些库?
+1

请发布完整的错误。您发布的部分忽略了最相关的信息:哪部分代码导致了错误。 –

+0

添加完整的错误。我还在代码中插入了一行。 –

回答

1

简短的回答是“这取决于”。对于作为C++标准库一部分的类/函数,编译器随附的手册页将列出需要哪些头和库;或者您也可以使用在线资源,例如cplusplus.com,MSDNGNU libstdc++ doxygen docs

对于像Boost这样的东西,你必须看看他们的文档;然而,显而易见的问题是'我怎么知道一个班级是否从提升' - 答案几乎是'谷歌它' - 随着时间的推移,你会习惯什么是和不在Boost中。

+0

Boost类通常位于'boost'命名空间的某个地方,因此应该很容易找出它们是否在Boost中。 –

+0

@Martinho:这可以帮助给你一个提示,但是在通常情况下,在网上发布的片段摘录人员可能已经完成了“使用命名空间提升” - 所以只是因为前面没有'boost ::'而没有做'这不意味着它不是来自提升。 – DaveR

0

一般来说,如果找不到所需的库或不知道如何构建和使用它,找到这些信息的最佳位置是:项目的文档或维基页面,论坛或IRC频道。要查找类/函数属于哪个项目,可以使用类/函数的名称进行搜索。

对于上述的代码段,你需要Boost。大部分你需要做的就是头文件#include。但某些图书馆需要你建立和链接它们。有关说明,请参阅'Getting Started on Microsoft Windows'或'Getting Started on Unix variants (e.g. Linux, MacOS)'。

如果您在Windows机器上工作,你可以从这里下载预编译的二进制文件:http://www.boostpro.com/download/

5

您发布的错误实际上是不是有相关的错误,或链接错误这是行:

std::istringstream in_stream = std::istringstream(compressed);

这导致一种遗传拷贝构造函数的调用被标记为私有,所以你应该将其替换为:

std::istringstream in_stream(compressed);

编译器输出实际上是在这种情况下,很清楚的。

+0

这两行代码执行相同的操作。这里不使用复制构造函数。 – RocketR

+0

@RocketR:第一个是*复制初始化*,它确实需要复制构造函数是可访问的。请参阅http://stackoverflow.com/questions/1051379/is-there-a-difference-in-c-between-copy-initialization-and-direct-initializatio/1051441#1051441 –

+0

看看我的示例http:// www .ideone.com/vj2fH我错过了什么? – RocketR

相关问题