2011-07-12 6 views
0

私は以下のコードを書いていませんでした。オープンソースでもうサポートされていません。私はVC++ Express 2010をインストールしたので、ほとんどの問題を解決することができたので、アプリケーションは実際にはWindowsのために書かれていましたが、髪の毛が引っ張られてはいましたが、私はいくつかの進歩を遂げています。std:string + WCHARをgccコードをVisual C++ 2010に連結する必要があります

私は1つの変換に引っかかっていると私はかなりVC++ 2010型変換のハンドルをもらっていないが、ここでコードが私に私の最後の頭痛の種を与えている...

パスがのstd :: stringとcFileNameですWCHARです。私はパスをWCHARに変換するのに成功しましたが、mEntries.push_backに問題がありました。私が必要としているのは、cFileNameを文字列に変換することです。これを行うためのさまざまな方法を試してみましたが、構文が間違っているか、VC++で動作していないか、

なぜそれがうまくいかず、文字列の多くの異なる "種類"がある(私はSQLスクリプトを書いていますが、これはばかげています)が、この時点では機能するように助けが必要です。

// Add files matching file spec to listing, returning number added. Each 
// filename is prepended with its path, if one was supplied in file spec. 

unsigned int DirList :: Add(const string & fspec) { 

// save path, if any 
STRPOS lastslash = fspec.find_last_of("\\/"); 
string path = lastslash == STRNPOS ? "" : fspec.substr(0, lastslash + 1); 
unsigned int count = 0; 
WIN32_FIND_DATA fd; 
HANDLE h = FindFirstFile(LPCWSTR(fspec.c_str()), & fd); 
if (h == INVALID_HANDLE_VALUE) { 
    return count; 
} 

do { 
    mEntries.push_back(
     new WinDirEntry(
       path + fd.cFileName, // add path back on 
       fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY 
     ) 
    ); 
    count++; 
} while(FindNextFile(h, & fd)); 

FindClose(h); 

return count; 
} 

エラーメッセージは次のとおりです。

error C2782: 'std::basic_string<_Elem,_Traits,_Alloc> std::operator +(std::basic_string<_Elem,_Traits,_Alloc> &&,const _Elem *)' : template parameter '_Elem' is ambiguous 
1>   ...\microsoft visual studio 10.0\vc\include\string(143) : see declaration of 'std::operator +' 
1>   could be 'WCHAR' 
1>   or  'char' 

error C2784: 'std::basic_string<_Elem,_Traits,_Alloc> std::operator +(std::basic_string<_Elem,_Traits,_Alloc> &&,std::basic_string<_Elem,_Traits,_Alloc> &&)' : could not deduce template argument for 'std::basic_string<_Elem,_Traits,_Alloc> &&' from 'WCHAR [260]' 
1> ...\microsoft visual studio 10.0\vc\include\string(109) : see declaration of 'std::operator +' 

error C2676: binary '+' : 'std::string' does not define this operator or a conversion to a type acceptable to the predefined operator 
+1

迅速なソリューションを使用することです'Find *'のansiバージョンです。これは明示的に 'FindFirstFileA'を使用しています。それ以外の場合は、おそらく[WideCharToMultiByte](http://msdn.microsoft.com/en-us/library/dd374130/(v = vs.85 \).aspx)のようなものが必要です – user786653

+0

ありがとうuser786653、私はFindFirstFileAを試してみましたが、 fspecに問題があったので、LPCWSTRのキャストを取り除きました。残念ながら、 "&" [errorC2664でパラメータ2をWIN32_FIND_DATA *からLPWIN32_FIND_DATAAに変換できませんでした]という問題がありました。WideCharToMultiByteの例を探していますが、今は私の頭の中に少しあると思います... – Acy

+0

@Acy:続けて 'WIN32_FIND_DATA'の代わりに' WIN32_FIND_DATAA'を使います。 – dalle

答えて

0

私は文字型と+演算子は、STDのために定義されていないとしてのstd :: string型は、あなたの基本的な文字を使用していますので、あなたの問題があると考えています。 :basic_stringとワイド文字配列。 Visual Studioはstd :: wstringをサポートしていると思います。これは、std :: stringの代わりにドロップされた場合にこの作業を行う可能性があります。

文字をエンコードする方法はさまざまですが、いくつかの種類の文字列があります。 ASCII、UTF-8などがあります。それらのすべてが基本的なchar *に収まるわけではなく、C++でそれほど大きな違いはありません。

+0

私もwstringを試しましたが、それは同様のエラーを修正する無限のチェーンでした。しかし、私はあなたとuser786653に同意します、私はすべてのものをwidechar型に変換することになります。しかし、それは多くのコードですが、私はそれを書いていないので、コンパイルする必要がありますので、私はそれを学ぶことができます。私はこの点に達するためにたくさんの型を変更しました。互換性のない型の間を行き来しているようです。とにかく、私はそれが私がそれを使用する唯一のものではないので、Visual Studioでコンパイルできるようにする必要があるので、私はそれがあまりにもひどく壊れないことを本当に願っています。 – Acy

3

pathstd::stringからstd::wstringに変換します。

std::string s("hello"); 
std::wstring ws; 

ws.assign(s.begin(), s.end()); 

あなたが動作するように、同じタイプの文字列の両方を持っているように、cFileNameためstd::wstringを作成します。

assign()方法あなたがstd::stringからstd::wstringに変換しようとしている場合にのみ機能します。すべてのUnicode文字が正しく動作しません。 std::stringstd::wstringとの間の変換について語っこのcodeguru.comフォーラムのトピックが見つかり:How to convert string to wstring?

参考:

MSDN:std::wstring

cplusplus.com:std::string/std::wstring

関連する問題