2009-06-16 1 views
4
_TCHAR* strGroupName = NULL; 
const _TCHAR* strTempName = NULL; 

//Assign some value to strTempName 

strGroupName = _tcschr(strTempName, 92) //C2440 

VS2008에서이 코드를 컴파일하는 동안 오류가 발생합니다. VC6에서는 잘 컴파일됩니다.'const wchar_t *'에서 '_TCHAR *'로 변환 할 수 없습니다.

오류 C2440 : '=': '_TCHAR *'에 '* const를 wchar_t를' 에서 변환 할 수는

문제로 내가 그것을 어떻게 해결합니까 보인다 무엇?

답변

5

strGroupName = (_TCHAR*)_tcschr(strTempName, 92); 

으로 VS2008 캐스트 유형에 좀 더 엄격한 가지고 나에게 보인다 캐스팅 시도하고 자동으로 경우에 따라 그들을하지 않습니다.

+0

+1. 이것은 컴파일 오류를 없앴습니다. – bobbyalex

+3

const_cast를 사용하십시오. – GManNickG

2

_tcschr은 const 포인터를 반환합니다. 따라서 반환 값은 const _TCHAR* strGroupName = NULL;이어야합니다. strGroupName을 const 포인터로 변경할 수없는 경우 두 포인터를 비 const 포인터로 선언하십시오.

+0

이것은 괜찮지 만 const 변수를 예상하지 않는 나머지 코드에 영향을주기 때문에 strGroupName을 const로 변경할 수 없습니다. 예를 들면 기능. – bobbyalex

+1

그런 다음 strTempName과 strGroupName을 둘 다 비 const로 만듭니다. – Naveen

+0

+1 둘 다 non-const 일 수있는 주석을 포함합니다 (아마도 답변에 추가하겠습니까?) –

4
strGroupName = const_cast<_TCHAR*>(_tcschr(strTempName, 92)); 

사용중인 함수의 변형에 const _TCHAR *이 있고 const _TCHAR *이 반환되기 때문입니다.

다른 변형은 const _TCHAR *가 아닌 _TCHAR *로 선언 된 strTempName을 갖는 것입니다. 이 경우 _TCHAR * 매개 변수가 있고 _TCHAR * 값을 리턴하는 변형 함수가 사용됩니다.

+0

Jack의 대답은 괜찮습니까? 그것은 컴파일 오류를 없애 버렸지 만, 나는 당신과 당신 사이의 차이를 알고 싶다. – bobbyalex

+0

이 버전이 더 좋습니다. 캐스트가 무엇인지 구체적으로 지정할 수 있습니다. 즉, 관련이없는 유형의 캐스트가 아니라 const 만 제거하는 것입니다. –

+0

@Bobby const_cast 연산을 사용하면 간단한 검색을 수행하여 코드에서 const 형변환을 쉽게 찾을 수 있습니다. 나는 정말로 필요하지 않으면 const 캐스팅을 권장하지 않습니다. 두 번째 대안 (strTempName을 non-const로 설정)이 더 선호됩니다. 왜냐하면 더 이상 const를 변경하지 않기 때문입니다. Btw, strTempName을 const로 선언 한 이유가 무엇입니까? –

1

strGroupNameconst에 대한 포인터 여야합니다.

const _TCHAR* strGroupName = _tcschr(strTempName, 92); 

초기화 할 때까지 선언 할 필요가 없습니다.