5

当我尝试编译下面的代码时(在 Qt 4.8 中使用 llvm-g++-4.2 (GCC) 4.2.1),我收到以下错误:

../GLWidget.cpp:24:   instantiated from here
../GLWidget.cpp:24: error: explicit instantiation of 'std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]' but no definition available 

这个错误是什么意思,我应该怎么做才能修复它?

源代码:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

void testOStream(){
    filebuf fb;
    fb.open ("test.txt",ios::out);
    std::ostream os(&fb);
    std::string test("test");
    os << test; // This line has the problem
    fb.close();
}
4

3 回答 3

3

如果您使用的是 C++11 之前的 C++ 版本,您可能需要添加#include <ostream>到您的程序中。

只有 C++11 和更高版本才<iostream>需要#include <ostream>.

标题<iostream>概要

C++2003:

namespace std {
   extern istream cin;
   extern ostream cout;
   extern ostream cerr;
   extern ostream clog;

   extern wistream wcin;
   extern wostream wcout;
   extern wostream wcerr;
   extern wostream wclog;

}

C++2011:

#include <ios>
#include <streambuf>
#include <istream>
#include <ostream>

namespace std {
    extern istream cin;
    extern ostream cout;
    extern ostream cerr;
    extern ostream clog;

    extern wistream wcin;
    extern wostream wcout;
    extern wostream wcerr;
    extern wostream wclog;
}
于 2012-12-21T16:30:52.277 回答
0

确保你#include <ostream>. 早于 C++11,<ostream>不保证包含在<iostream>. 的定义os很好的原因可能是因为它通常定义了哪些标准库头文件包括其他标准库头文件(除非指定)。在您的实现中,<iostream>可能包含了 的定义std::ostream,但没有包含它的函数。但是,如果您正在编译 C++11,它应该包含所有内容。

于 2012-12-21T16:27:47.297 回答
0

正如@ChadCambell 指出的那样,问题原来是Qt 4.8 使用-mmacosx-version-min=10.5,但应该是-mmacosx-version-min=10.7

我在这里找到了更多有关该问题的使用信息:

http://qt-project.org/forums/viewthread/19106/P15

更新到 Qt 5.0 也解决了这个问题

于 2012-12-22T10:31:13.723 回答