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 に答える