У меня проблемы с выяснением, как решить ошибку компилятора, с которой я столкнулся. Я сократил это до этого простейшего представления:
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");
}
Ошибка компилятора:
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, кстати, но воспроизводится на паре других моих компиляторов (это в кроссплатформенной игре).