答えて
あなたの文字列リテラルwstring
が、より簡単にwstring
より(崩壊経由const wchar_t*
に)bool
に変換さconst wchar_t[]
ではありません。ビジュアル・スタジオでコードを実行
は私に、このエラーが発生しました:ほとんど完璧な説明を与える
warning C4800: 'const wchar_t *' : forcing value to bool 'true' or 'false' (performance warning)
。
文字列リテラルは 'const wchar_t *'ではありません - これはconstの配列 'wchar_t'です(まったく同じものではありません)。 –
正しい。私はそれを修正します。 – DeathTails
あなたは暗黙の型変換のルールに噛まれています。問題はL"my string data for test"
がbool
でもstd::wstring
でもないことです。実際にはwchar_t
というconst配列です。
bool
に変換することができます。これは、配列の崩壊によってポインターに変換され、次にbool
へのポインターが変換されます(ポインターがNULLの場合はテストします)。
適切なコンストラクタを呼び出すことによってstd::wstring
に変換できます。
問題は、標準では、コンパイラーが「間違った」ものを選択するように求めていることです。
おそらく、適切な追加のオーバーロードを書くことをお勧めします。例えば:
void test(const wchar_t* p)
{
test(std::wstring(p));
}
リテラルワイド文字列型const wchar_t [N+1]
です。 >const wchar_t*
- - >bool
const wchar_t[N+1]
- >const wchar_t*
- >std::wstring
最初のバージョンは、オーバーロードの解決ために選択され
const wchar_t[N+1]
:あなたはtest
にそれを渡すと、2つの可能性のある経路が存在します標準ブール変換をbool
に、ユーザ定義の変換をstd::wstring
にそれぞれ優先させることをお勧めします。可能な解決策の1つは、Martin suggestsというように、
std::wstring
を明示的に作成することですが、これは後で再度お考えになると思います。代わりに、別の名前の2つの関数を使用して問題を回避するか、const wchar_t*
を受け取り、std::wstring
バージョンに転送するオーバーロードを追加します。void test(const wchar_t* w) { test(std::wstring{w}); }
これは、私が何を言おうとしていたかをはっきりと説明しています。ワークアラウンドを追加することを提案できますか(別のオーバーロードを追加して「右」関数を呼び出す) –
2番目の場合、シーケンスは 'const wchar [N + 1]' - > 'const wchar *' - > 'std :: wstring'です(実際には' wchar'は 'wchar_t'でなければなりません)。基本的にポインタを 'bool'に変換する方が、ユーザ定義の変換よりも優先されます(つまり、' std :: wstring'のコンストラクタを呼び出す)。 – Peter
@Peter Fixed、ありがとうございます。 – TartanLlama
すべての答えは、C++ 14を使用している場合、最初のケースで渡すリテラルを微調整するだけです。
#include <iostream>
#include <string>
using namespace std;
//Function for bool data
void test(const bool b) {
wcout << L"bool data is : " << b << endl;
};
//Function for wstring data
void test(const wstring &w) {
wcout << L"wstring data is : " << w.c_str() << endl;
};
int main() {
test(L"my string data for test"s);
test(true);
return 0;
}
wstring data is : my string data for test
bool data is : 1
- 1. 私は同じ名前を持つクラスとモジュールを持つクラス
- 2. のConfigParserは、同じ名前を持つ
- 3. は、私は以下のような機能を持つランタイムエラー
- 4. 同じ名前の列を持つ2つのテーブルの重複をチェックする
- 5. 同じ名前の2つの異なるDLLを持つプロジェクト
- 6. 私はアニメーションという名前のクラスと同じディレクトリにanimationResources.xamlという名前のリソースディクショナリを持つクラスC#
- 7. 同じ名前の複数のパラメータを持つJAX-RSクエリ
- 8. axis2:同じ名前を持つ2つの異なるWebサービス
- 9. 同じ署名を持つ他のアプリとユーザーの情報を共有する
- 10. 同じinputChannelと異なる署名を持つ複数の@ServiceActivatorメソッド
- 11. Entity Frameworkのコードファーストと同じ名前を持つが、異なる名前空間内の2つのエンティティは
- 12. パイソン - 同じ名前を持つ複数の継承
- 13. 同じ名前のポート名を持つJointJSが機能しない
- 14. 「同じ」クエリは、私は以下のようにほぼ同じで2つのクエリを持って
- 15. Docusign - 2つの署名ブロックのうち1つの署名ブロックのみを署名可能にする
- 16. 名前は、私は、以下の機能を持っている予約語
- 17. は、私はこのような名前付きの値を持つベクトルを持つという名前の値
- 18. 同じ名前のパラメータを持つhttp_build_query
- 19. 同じ名前と内容を持つ2つのテキストファイルは同じハッシュ(sha256)を持ちますか?
- 20. は、JavaジャージーRESTサービスに同じ名前を持つ複数のFormDataParamsを投稿
- 21. C言語の `container_of`マクロとCと同じ署名を持つ
- 22. のMySQLのStoredProcedureは、私は2つの列を持つテーブルという名前の領域を有する
- 23. iが同じ名前を持つ2つの入力を持つ
- 24. 以下の名前のない関数を持つPHP __construct
- 25. 同じ名前の2つのフィールド
- 26. 同じ名前空間に同じ名前のクラスとインタフェースを持つことはできますか?
- 27. Xcode 4:複数のターゲット、複数のリソース共有Xibで使用する同じ名前のイメージを持つフォルダ?
- 28. 同じタイプ名、同じXSD名前空間を持つWCFサービスタイプ
- 29. 同じ名前を持つ入力を検証する
- 30. 同じ名前のレイアウトを持つ2人のメンバーを持つR.java
も ')('メインのボイドを受け入れ時代遅れコンパイラことがございます。 (実際はそうではありませんが、それはなぜそれほど普及しているのですか)。 – StoryTeller