2016-07-20 5 views
1
는 I는 동일한 이름을 아래와 같이 여러 서명이 두 가지 기능이있다

기능? 문자잘못된 검출

+0

또한 '무효 메인 허용 오래된 컴파일러 수도()'. (실제로는 아니지만 왜 그렇게 널리 퍼져 있습니까?) – StoryTeller

답변

3

귀하의 문자열은 wstring하지만 더 쉽게 wstring보다 (A const wchar_t*에 붕괴를 통해)을 bool로 변환하는 const wchar_t[] 없습니다. 꽤 많은 완벽한 설명을 제공
warning C4800: 'const wchar_t *' : forcing value to bool 'true' or 'false' (performance warning)
: 비주얼 스튜디오에서 코드를 실행

날이 오류를했다.

+1

문자열 리터럴은'const wchar_t *'가 아니며, const'wchar_t'의 배열입니다 (별로 똑같은 것은 아닙니다). –

+0

수정. 나는 그것을 고쳐 줄 것이다. – DeathTails

1

암시 적 유형 변환에 대한 규칙에 물렸습니다. 문제는 L"my string data for test"bool도 아니고 std::wstring도 아닌 것입니다. 사실 wchar_t의 const 배열입니다.

포인터가 배열에 붕괴되어 bool (포인터가 null인지 테스트 - 그렇지 않은 경우) 포인터가 오는 bool으로 변환 될 수 있습니다.

적절한 생성자를 호출하여 std::wstring으로 변환 할 수 있습니다.

문제는 표준에서 컴파일러가 "잘못된"것을 선택해야한다는 것입니다.

아마 가장 적합한 방법은 적절한 추가 과부하를 작성하는 것입니다. 예를 들어 :

void test(const wchar_t* p) 
{ 
    test(std::wstring(p)); 
} 
4

리터럴 다양한 문자열 유형 const wchar_t [N+1]이다. 당신이 test에 전달하면,이 두 가지 가능한 경로 :

  1. const wchar_t[N+1] ->const wchar_t* ->bool
  2. const wchar_t[N+1] ->const wchar_t* ->std::wstring 첫 번째 버전이 있기 때문에 선택

오버로드 확인 표준 불리언 변환을 bool으로 선호하는 것은 사용자 정의 변환보다 std::wstring을 선호합니다.

하나의 가능한 해결책은 Martin suggests과 같이 명시 적으로 std::wstring을 작성하는 것일 수 있지만 나중에 다시 물어볼 가능성이 있습니다. 그 대신 문제를 피하기 위해 다른 이름을 가진 두 가지 기능을 사용하거나 const wchar_t*을 사용하고 std::wstring 버전으로 전달하는 오버로드를 추가합니다.

void test(const wchar_t* w) { 
    test(std::wstring{w}); 
} 
+0

그 말은 내가하는 말에 대한 훨씬 더 명확한 설명입니다. 내 workround를 추가 할 것을 제안 할 수 있습니까? (다른 "오버로드"를 추가하여 "right"함수를 호출 할 수 있습니까?) –

+3

두번째 경우에, 시퀀스는'const wchar [N + 1]'->'const wchar *'->'std :: wstring' (실제로'wchar'는'wchar_t'이어야합니다)입니다. 기본적으로 포인터를 'bool'로 변환하는 것이 사용자 정의 변환 (즉,'std :: wstring'의 생성자 호출)보다 선호됩니다. – Peter

+0

@Peter Fixed, thanks 고마워. – TartanLlama

3

모든 대답이 주어지면 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; 
} 

output :

wstring data is : my string data for test
bool data is : 1