2

文字列の連結に問題があります。

std::deque<std::string> fileNamesVector;
double * res_array;
string *strarr;

size = fileNamesVector.size();
res_array = new double[size];
strarr = new string [size];

res_array に 4 つのスペースを追加し、その後に filenamevector を追加する必要があります。これどうやってするの。

strarr[i] = res_array[i] + "     " + fileNamesVector[i];

しかし、それはエラーを出します。「expには算術型または列挙型が必要です」と言って助けてください。

4

3 に答える 3

4

C++ では、double、a​​、char *またはの間の暗黙的な変換はありませんstd::string

res_array[i] + " "に double を追加しようとしているchar *ため、コンパイラは暗黙的な変換を試みますが、何も存在しないため、operator+数値型が必要であるというエラーが表示されます。

代わりに、明示的に文字列に変換する必要がありres_array[i]ます。

// File: convert.h
#include <iostream>
#include <sstream>
#include <string>
#include <stdexcept>

class BadConversion : public std::runtime_error {
public:
  BadConversion(std::string const& s)
    : std::runtime_error(s)
    { }
};

inline std::string stringify(double x)
{
  std::ostringstream o;
  if (!(o << x))
    throw BadConversion("stringify(double)");
  return o.str();
}

上記の例は The C++ FAQ からのものです。このトピックに特化したスタックオーバーフローの質問がたくさんありますが、TC++FAQ は OG であるという真の叫びに値します :)

または C++11 では、次を使用しますstd::to_string

strarr[i] = std::to_string(res_array[i]) + "     " + fileNamesVector[i];
于 2012-12-07T19:59:48.590 に答える
0

たとえば、生の配列や生のポインタの配列を使用しないでstd::vectorください。

それは理由のために標準ライブラリにあります。

つまり、あなたの人生をずっと楽にするために。:-)

#include <assert.h>     // assert
#include <iostream>     // wcout, endl
#include <queue>        // std::dequeue
#include <stddef.h>     // ptrdiff_t
#include <string>       // std::string, std::to_string
#include <utility>      // std::begin, std::end
#include <vector>       // std::vector
using namespace std;

typedef ptrdiff_t       Size;
typedef Size            Index;

template< class Type >
Size size( Type const& c ) { return end( c ) - begin( c ); }

string spaces( Size const n ) { return string( n, ' ' ); }

wostream& operator<<( wostream& stream, string const& s )
{
    return (stream << s.c_str());
}

#ifdef __GNUC__
// Possibly add a workaround implementation of std::to_string
#endif

int main()
{
    deque<string>   file_names_vector;
    vector<double>  res_arr;

    file_names_vector.push_back( "blah.foo" );
    res_arr.push_back( 3.14 );

    assert( file_names_vector.size() == res_arr.size() );
    Size const size = file_names_vector.size();
    vector<string>  str_arr;

    for( Index i = 0; i < size; ++i )
    {
        str_arr.push_back( to_string( res_arr[i] ) + spaces( 5 ) + file_names_vector[i] );
    }

    for( auto const& s : str_arr )
    {
        wcout << s << endl;
    }
}
于 2012-12-07T20:35:16.243 に答える
0

まだ C++11 を使用していない場合は、次のように using にキャストする必要がdoubleありstd::stringますboost::lexical_cast

#include <boost/lexical_cast.hpp>
...
strarr[i] = boost::lexical_cast<std::string>(res_array[i]) + "     " + fileNamesVector[i];

http://www.boost.org/libs/conversion/lexical_cast.htm

余談ですが、メモリ管理に生のポインターを使用しないことを強くお勧めします。可変サイズの配列が必要な場合は、 andstd::vectorではなく、最初の選択肢にする必要があります。newdelete

于 2012-12-07T20:16:59.810 に答える