2009-07-17 2 views
1

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

Мои функции код

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 станд :: оператор == (Const станд :: istreambuf_iterator < _Elem, _Traits> &, Const станд :: istreambuf_iterator < _Elem, _Traits> &)': не может вывести аргумент шаблона для «сопзЬ станд :: 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; 
+1

Вы можете разместить код узла? – rlbond

+0

Как выглядит ваше определение узла ? И полный код вызова, который начинается с «List myList;», как указано выше? Спасибо. –

+0

Только что отправил определение Node и вызывающий код – Jaelebi

ответ

1

Try:

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

string::compare documentation

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

#include <string> 
using std::string; 
+0

Кажется, это работает. Спасибо – Jaelebi

+0

Это все хорошо и хорошо ... но вы действительно не решили проблему. оператор == должен работать. – rlbond

+0

@ rlbond наиболее определенно. Я знаю, что какая-то документация для строки (http://www.cplusplus.com/reference/string/string/) не включает оператор ==, но визуальный C++ делает (http://msdn.microsoft.com/en-us/ библиотека/8ww0haah.aspx) –

0

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

0

Это выглядит нормально, я не могу видеть, как 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 { ... 

Что с реальной проблемой, там что-то еще происходит.

4

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

Во-первых,

locate(T n) 

должен быть

locate(const T& n) 

Это экономит возможную копию п

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

#include <string> 
+0

Хороший запрос о включении –

+0

Хорошо сделано .. В соответствии с последним комментарием OP, включенный файл оказывается проблемой. – Naveen

+0

Спасибо! :) Разве вам не нравятся непонятные ошибки компилятора C++? – Rodyland

0

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^