Какая проблема с шаблонами C ++ происходит с этой ошибкой? - PullRequest
4 голосов
/ 16 мая 2010

При запуске gcc v3.4.6 на Botan v1.8.8 я получаю следующую ошибку во время компиляции при сборке приложения после успешной сборки Botan и запуска самопроверки:

../../src/Botan-1.8.8/build/include/botan/secmem.h: In member function `Botan::MemoryVector<T>& Botan::MemoryVector<T>::operator=(const Botan::MemoryRegion<T>&)':
../../src/Botan-1.8.8/build/include/botan/secmem.h:310: error: missing template arguments before '(' token

Что говорит мне эта ошибка компилятора? Вот фрагмент secmem.h, который включает в себя строку 310:

[...]
/**
* This class represents variable length buffers that do not
* make use of memory locking.
*/
template<typename T>
class MemoryVector : public MemoryRegion<T>
   {
   public:
      /**
      * Copy the contents of another buffer into this buffer.
      * @param in the buffer to copy the contents from
      * @return a reference to *this
      */
      MemoryVector<T>& operator=(const MemoryRegion<T>& in)
         { if(this != &in) set(in); return (*this); }  // This is line 310!
[...]

1 Ответ

10 голосов
/ 16 мая 2010

Измените это на:

{ if(this != &in) this->set(in); return (*this); } 

Я подозреваю, что функция set определена в базовом классе? Неквалифицированные имена не ищутся в базовом классе, который зависит от параметра шаблона. Так что в этом случае имя set, вероятно, связано с шаблоном std::set, который требует аргументов шаблона.

Если вы квалифицируете имя с помощью this->, компилятору явно будет сказано изучить область действия класса, и он включит в этот поиск зависимые базовые классы.

...