【发布时间】:2009-05-08 21:45:51
【问题描述】:
我无法弄清楚如何解决我遇到的编译器错误。我已将其简化为最简单的表示形式:
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 顺便说一句,但它在我拥有的其他几个编译器上重现(这是在跨平台游戏中)。
【问题讨论】: