использовать операторы в шаблонах в C ++ - PullRequest
1 голос
/ 17 июля 2009

Я пытаюсь реализовать класс List, используя указатели, и пытаюсь реализовать функцию LOCATE (T x), где T для шаблона и возвращает первую позицию элемента x, если найден, иначе возвращает последнюю позицию + 1.

Код моей функции

template<class T>
    int List<T>::locate(T n) const
    {
        int size = end();
        Node<T> * p = head_;

        for (int i = 0; i < size; i++)
        {
            if (p->data() == n) // fails on this line
                return i;
            p = p->link();
        }
        return size; // if no match found
     }

Я инициализирую свой список с T в виде строки как

List<string> myList;

но я получаю сообщение об ошибке

'bool std :: operator == (const std :: istreambuf_iterator <_Elem, _Traits> &, const std :: istreambuf_iterator <_Elem, _Traits> &)': не удалось получить аргумент шаблона для 'const std :: istreambuf_iterator <_Elem, _Traits> & 'from' std :: string

Почему возникает ошибка, хотя для строкового класса определен оператор '=='? «

Код для узла:

template<typename T>
class Node
{
  public:

    // Constructors
    Node();
    Node(T d, Node<T> * l = NULL);

    //Inspectors 
    T data() const;
    Node<T> * link() const;

    // Mutators 
    void data(T d); // assigns new value to Node
    void link(Node<T> * l); // points this Node to a different one

    // Destructor
    ~Node();

    private:
  Node<T> * link_;
  T data_;
};

template<typename T>
    T Node<T>::data() const
    {
        return data_;
    }
template<typename T>
    Node<T>* Node<T>::link() const
    {
        return link_;
    }

Телефонный код

List<string> test;
test.add("abc");
cout << test.locate("abc") << endl;

Ответы [ 5 ]

4 голосов
/ 17 июля 2009

Не вдаваясь в ваш код, я замечаю несколько проблем.

Во-первых,

locate(T n) 

должно быть

locate(const T& n)

Это сохраняет возможную копию n

И чтобы задать глупый вопрос, вы уверены, что сделали:

 #include <string>
1 голос
/ 17 июля 2009

Попробуйте:

if( n.compare(p->data()) == 0 )

строка :: сравнить документацию

Как отмечается в комментариях ниже, оператор == должен работать. Пожалуйста, проверьте, что у вас есть

#include <string>
using std::string;
0 голосов
/ 17 июля 2009

Начните удалять код, пока он не заработает снова. Некоторые опечатки или мошеннические макросы или конфликтующие пространства имен портят жизнь.

Будет ли это компилироваться само по себе?

string data = "bla";
Node<string> p("bla");
bool b = p.data() == data;

(Каждый программист на C ++ должен сделать cout << "bla" << end; опечатка. Очень занимательно)

0 голосов
/ 17 июля 2009

Это выглядит хорошо, я не вижу, как std::istreambuf_iterator попадает в картину ...

Одна вещь, которую вы, возможно, захотите отрегулировать, - это использование const T& вместо T в качестве параметров ваших методов, например

  Node(const T& d, Node<T> * l = NULL);
  void data(const T& d);

  int List<T>::locate(const T& n) const { ...

Что касается настоящей проблемы, то обязательно должно быть что-то еще.

0 голосов
/ 17 июля 2009

Ссылка на std::istreambuf_iterator своеобразна, поскольку ничто в показанном вами коде не оправдывает этого - не могли бы вы показать нам Node и какой другой код затрагивает это в минимальном ошибочном примере? Попытка избавиться от проблемы с помощью очень частичного кода и сообщения об ошибке очень похожа на натяжение зубов ...! -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...