web-dev-qa-db-ja.com

`std :: basic_ofstream <char、std :: char_traits <char >> :: basic_ofstream(std :: string&) 'を呼び出すための一致する関数がありません

ユーザーにファイル名を尋ねると、そのファイルが開かれるプログラムを作成しようとしています。コンパイルすると、次のエラーが発生します。

no matching function for call to std::basic_ofstream<char, 
std::char_traits<char> >::basic_ofstream(std::string&)

これは私のコードです:

using namespace std;

int main()
{ 
    string asegurado;
    cout << "Nombre a agregar: ";
    cin >> asegurado;

    ofstream entrada(asegurado,"");
    if (entrada.fail())
    {
        cout << "El archivo no se creo correctamente" << endl;
    }
}      
7
ToM MaC

_std::ofstream_ は、C++ 11以降を使用している場合にのみ、_std::string_で作成できます。通常、これは_-std=c++11_(gcc、clang)で行われます。 c ++ 11にアクセスできない場合は、_std::string_のc_str()関数を使用して、_const char *_をofstreamコンストラクターに渡すことができます。

また、 Ben指摘 であるため、コンストラクターの2番目のパラメーターに空の文字列を使用しています。提供される場合の2番目のパラメーターは、タイプ_ios_base::openmode_である必要があります。

これであなたのコードは

_ofstream entrada(asegurado); // C++11 or higher
_

または

_ofstream entrada(asegurado.c_str());  // C++03 or below
_

また、次のことをお読みになることをお勧めします。 「名前空間stdを使用する」が悪い習慣と見なされるのはなぜですか?

13
NathanOliver

コンストラクターofstream entrada(asegurado,"");は、 std::ofstream のコンストラクターと一致しません。 2番目の引数は ios_base である必要があります。以下を参照してください。

entrada ("example.bin", ios::out | ios::app | ios::binary);
                            //^ These are ios_base arguments for opening in a specific mode.

プログラムを実行するには、ofstreamコンストラクターから文字列リテラルを削除するだけです。

ofstream entrada(asegurado);

ここに実例があります。 を参照してください

c++03以下を使用している場合、std::stringofstreamのコンストラクターに渡すことはできません。c文字列を渡す必要があります。

ofstream entrada(asegurado.c_str());
1