Почему я получаю неоднозначный вызов для следующих функций? - PullRequest
2 голосов
/ 18 сентября 2011

Примите во внимание следующее:

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, тогда как в моей реализации это не так (еще одно предположение - черты типа, но в источнике нет никаких доказательств этого)?

Ответы [ 2 ]

3 голосов
/ 18 сентября 2011

Ах, один из тех случаев, когда вы говорите: "Не было бы лучше, если бы в c ++ значение 0 не было равно нулю?"

В любом случае, ваш тип итератора typedef'd toT *, который является char *, а 0 - это точное значение для char *, отсюда и неоднозначность (как писал К-балл).В std :: string тип итератора не будет char *, он будет чем-то необычным, похожим на другой (шаблонизированный) класс ...

1 голос
/ 18 сентября 2011

Поскольку 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.

...