考虑以下:
template <typename T>
class testString
{
public:
typedef T* iterator;
void insert(iterator aPos, size_t numChars, T aChar);
testString<T>& insert(size_t aIndex, size_t numChars, T aChar);
};
template <typename T>
void testString<T>::insert( iterator aPos, size_t numChars, T aChar )
{
}
template <typename T>
testString<T>& testString<T>::insert( size_t aIndex, size_t numChars, T aChar )
{
return *this;
}
int main()
{
testString<char> c;
c.insert(0, 10, 'a'); // ambiguous call
c.insert(1, 10, 'a'); // compiles fine
return 0;
}
为什么我接到一个模棱两可的电话?最初,我有一个猜测(因为它是 0,它可以是任何东西),但后来我看了std::string
. 我查看了源码,这是两个函数:
void insert ( iterator p, size_t n, char c );
string& insert ( size_t pos1, size_t n, char c );
我用 std::string 尝试了同样的调用,效果很好。现在我不知道为什么0
可以使用std::string
并且在我的实现中立即被识别为一段size_t
时间它不是(另一个猜测是类型特征,但源代码中没有证据)?