请考虑以下事项:
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
,而在我的实现中它不是(另一种猜测是类型特征,但没有证据表明它在来源)?
答案 0 :(得分:3)
啊,其中一次你喜欢“如果在c ++中,0与null不同,那会不会更好?”
无论如何,你的迭代器类型是对T *的类型定义,它是char *,而0是char *的精细值,因此模糊(呃,如K-ballo所写)。在std :: string中,迭代器类型不是char *,它会像另一个(模板化的)类一样花哨......
答案 1 :(得分:1)
由于0
可以被视为指针和整数,因此会产生歧义。
如果您想区分它们,我的建议是将T *
包裹在class
内testClass
。这就像是:
template <typename T>
class testString
{
public:
class iterator
{
public:
T *addr;
}
void insert(iterator aPos, size_t numChars, T aChar);
testString<T>& insert(size_t aIndex, size_t numChars, T aChar);
};
如果您注意到STL要么,则不能将整数值作为迭代器发送,但必须传递类型为whateverclass<whatevertype>::iterator
的迭代器。