2009-07-17 96 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; 

,但我得到一個錯誤信息

'布爾的std ::運算符==(常量的std :: istreambuf_iterator < _Elem,_Traits> &,常量的std :: 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 2009-07-17 05:27:46

+0

你對節點的定義是什麼樣的?而完整的調用代碼,以「列表 myList;」開頭的代碼,如上所示? 謝謝。 – 2009-07-17 05:30:46

+0

剛剛發佈節點的定義和調用代碼 – Jaelebi 2009-07-17 05:35:01

回答

1

嘗試:

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

string::compare documentation

正如下面所指出的評論,運營商==應該工作。請仔細檢查你是否有

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

std::istreambuf_iterator參考奇特如沒有在你的代碼顯示證明它 - 可以請你告訴我們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

Star刪除代碼直到它再次工作。一些錯字或流氓宏或相沖突的命名空間搞砸了。

這會自行編譯?

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

(每個C++程序員應該做出COUT < < 「喇嘛」 < <末;錯字非常有趣)