나는 컴파일러 오류를 해결하는 방법을 알아내는 데 어려움을 겪고 있습니다. 나는이 간단한 경우의 표현으로 그것을 아래로 감소했습니다어떻게이 템플릿 코드를 모호하게 할 수 있습니까?
enum EAtomId { EAtomId_Test };
int StringFormat(char* o_dest, size_t i_destSizeChars, const char* i_format, ...);
template <size_t SIZE>
int StringFormat(char (&o_dest)[SIZE], EAtomId i_format, ...);
void func()
{
char textBuffer[1000];
StringFormat(textBuffer, EAtomId_Test, "hi there");
}
컴파일러 오류는 다음과 같습니다 BTW 전체 오류의
repro.cpp(17) : error C2666: 'StringFormat' : 2 overloads have similar conversions
C:\Users\sbilas\Desktop\repro.cpp(9): could be 'int StringFormat(char *,size_t,const char *,...)'
while trying to match the argument list '(char [1000], EAtomId, const char [9])'
합니다. 나는 조금 두 가지 사용 가능한 버전을 나열하지 않습니다 놀랍군요.
나는이 오류와 몇 가지 문제가 있습니다. 첫째, 모호한 이유는 모르겠다. 일치하는 명백한 경우 컴파일러는 char (&) [] 버전을 보지 않아야합니까? 둘째, 조회를 수행 할 때 해당 열거 형을 size_t로 변환하지 못하게하려면 어떻게해야합니까? 매우 구체적인 C++ 규칙을 실행하고있는 것처럼 보입니다.
나에게 가장 쉬운 해결 방법은 실제 버퍼 앞에 버퍼 크기의 size_t를 넣는 것입니다. 그러나 그것은 우리가 코드에 버퍼를 넣고 크기를 넣는 우리의 모든 관습을 깨뜨릴 것입니다. 이것을 할 또 다른 방법이 있습니까?
이것은 VC++ 2005 btw에 있지만 다른 크로스 컴파일러에서 재생합니다 (이것은 크로스 플랫폼 게임에 있습니다).
int StringFormat(char* o_dest, size_t i_destSizeChars,
const char* i_format, ...);
template <size_t SIZE>
int StringFormat(char (&o_dest)[SIZE], EAtomId i_format, ...);
기능 템플릿 및 일반 (비 템플릿) 기능을 모두 사용할 수있는 경우 인수 종속 조회 및 대체 규칙에 최대 읽기 :
자세한 답변을 보내 주셔서 감사합니다. 내가 당신을 올바르게 이해한다면, param 2에서 "가능한 승진과 통합 전환"은 "신원 전환"만큼이나 강력합니까? 나는 컴파일러가 변환을 필요로하는 경우보다 identity를 선택하기를 원할 것이다. 순서를 변경하는 것 외에이 문제를 해결할 방법을 제안 할 수 있습니까? 내가 뭘하려고 정적 크기의 문자열 버퍼에 대한 자동 길이 안전을 얻을 수 있습니다. 동시에 형식 문자열을 지정하는 두 가지 방법이 있습니다. 리터럴 및 "원자"를 통해 (현지화를 위해 사전에서 찾아 보았습니다). – scobi