шаблон класса и перегрузка '==' - PullRequest
1 голос
/ 08 декабря 2010

Я делаю стек, в котором мне нужно использовать такое сравнение в какой-то функции. Но я застрял, так как не знаю, как должен выглядеть прототип для этого.

У меня есть следующая строка в функции.

template <class T>
void function1(T i)
{
   if(i == 'a')
       //do something
}

Интересно, знаете, как должен выглядеть прототип перегрузки?

EDIT Не знаю, стоит ли упоминать, во всяком случае, это то, что я пробовал до сих пор шаблон

bool Stack<T>::operator==(char c) const
{
    cout << c << endl; // just some test
}

Не нужно комментировать, как работает эта функция, так как я еще не закончил ее. Эта часть будет скомпилирована, однако в той части, где я впервые вызываю эту функцию, находится Stack :: push (T i). Компилятор будет жаловаться, что для этого нет соответствующей функции.

 error: no match for 'operator==' in 'i == '#''

Ответы [ 3 ]

1 голос
/ 09 декабря 2010

Для операторов перегрузки имя функции - operator, за которым следует фактический оператор, поэтому operator==. Возвращает bool. Я не знаю, какие ваши аргументы должны основываться на вашем коде. Возможно, Stack<T>&, и вам нужно два из них для сравнения, если это бесплатная функция, и один для сравнения с ним, если это функция-член.

Если у вас есть способы конвертировать в Stack<T>, тогда предпочтите бесплатную функцию, чтобы вы могли конвертировать в левую часть.

0 голосов
/ 09 декабря 2010

Так что каждый T в вашей функции1 (t) должен реализовывать оператор ==;

Например, в качестве функции-члена

class A
{
public:
   bool operator == (char) const;
};

или оператора, не являющегося членом:

class A
{
public:
   friend bool operator == (const A&, char);
};
0 голосов
/ 09 декабря 2010

Я не уверен, что понимаю ваш вопрос.Для того, чтобы экземпляр функции шаблона function1 был правильно сформирован, вам нужно предоставить operator==, который сравнивает T и (я полагаю) char.

* 1006.* Теперь у вас есть две опции:
  • Предоставьте bool operator==(char) const функцию-член в вашем типе, например:

    struct A {
        bool operator==(char) const { /* ... */ }
    };
    
    
    function1(A()); // OK : comparison uses A::operator==(char)
    
  • Укажите bool operator==(const T &, char) в качестве свободной функции, например:

    struct A { /* ... */ };
    bool operator==(const A &, char) { /* ... */ }
    
    
    function1(A()); // OK : comparison uses operator==(const A &, char)
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...