предупреждения шаблона и справка об ошибках, (gcc) - PullRequest
0 голосов
/ 15 мая 2010

Я работаю над шаблоном класса контейнера (для int, bool, строк и т. Д.), И я застрял с этой ошибкой

cont.h:56: error: expected initializer before '&' token

для этого раздела

template <typename T>
const Container & Container<T>::operator=(const Container<T> & rightCont){

что именно я там не так сделал?

Также не уверен, что означает это предупреждение.

cont.h:13: warning: friend declaration `bool operator==(const Container<T>&, const Container<T>&)' declares a non-template function
cont.h:13: warning: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning

в этой позиции

template <typename T>
class Container{
    friend bool operator==(const Container<T> &rhs,const Container<T> &lhs);
public:

Ответы [ 2 ]

2 голосов
/ 15 мая 2010

В первом случае вы говорите просто Container в первый раз вместо Container<T>.

Во втором случае, я думаю, вам нужно повторить template: хотя функции-члены шаблонного класса неявно шаблонируются, функции-друзья не обязательно, поэтому необходимо быть более явным Я не уверен, какой именно синтаксис вам нужен для этой цели, но я думаю, что это:

  • до занятий, template<typename T> bool operator==( и т. Д.
  • в классе, bool operator==<>( и т. Д.

Я думаю, что именно это и пытается передать сообщение об ошибке, хотя и не очень четко.

1 голос
/ 15 мая 2010

В первом случае вы сделали все задом наперед. Когда вы указываете тип возвращаемого значения, вы должны включить список параметров шаблона в идентификатор шаблона (Container<T>), но когда вы указываете тип параметра, вам не нужно это делать (достаточно только Container)

template <typename T>
const Container<T> & Container<T>::operator=(const Container & rightCont){
   ...

Вы по какой-то причине сделали это наоборот.

Во втором случае, когда вы объявляете operator == своим другом, он просто предупреждает вас, что в данном случае operator ==, на который вы ссылаетесь, является обычной функцией. Это не может быть специализация шаблона. То есть для класса Container<int> функция

bool operator==(const Container<int> &rhs, const Container<int> &lhs) {
  // ...
}

будет другом. Но специализация шаблона функции

template <class U> 
bool operator==(const Container<U> &rhs, const Container<U> &lhs) {
  // ...
}

для U == int будет не другом Container<int>. Если это ваше намерение, вы в порядке.

Если вы хотите подружиться с специфической специализацией вышеприведенного шаблона, вам нужно будет сказать

template <typename T>
class Container {
  friend bool operator==<T>(const Container<T> &rhs, const Container<T> &lhs);
  ...

Если вы хотите подружиться со всеми специализациями вышеуказанного шаблона, вам нужно будет сказать

template <typename T>
class Container {
  template <class U> 
  friend bool operator==(const Container<U> &rhs, const Container<U> &lhs);
  ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...