将字符串写入ostream

时间:2012-12-21 16:21:57

标签: c++ gcc

当我尝试编译下面的代码时(在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();
}

3 个答案:

答案 0 :(得分:3)

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

<iostream>只需要使用C ++ 11及更高版本#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;
}

答案 1 :(得分:0)

确保#include <ostream>。早于C ++ 11,<ostream>并不保证<iostream>包含os<iostream>的定义很好的原因可能是因为它通常是实现定义的,哪些标准库头包含其他标准库头(指定的除外)。根据您的实施,std::ostream可能包含{{1}}的定义,但不包含随附的功能。但是,如果您正在编译C ++ 11,它包含所有内容。

答案 2 :(得分: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也解决了问题