1

リンクされたクラスの実装で '<<' 演算子をオーバーロードし、メイン関数で .cpp ファイルを宣言しましたが、機能せず、次のエラーが発生します: 演算子への未定義の参照 <& リスト)

これは、linkedlist.h ファイルでの ostream 関数の宣言です。

  friend std::ostream& operator<< (std::ostream& os, LinkedList<T>& list);

そして、これは ostream 関数の実装です:

 template <typename T>
   std::ostream& operator<< (std::ostream& os, LinkedList<T> list) 
 {
  list.current = list.start;
  while(list.current != NULL)
    {
        os<< list.current->info<<" -> ";
        list.current = list.current->next;
    }
    os<<"NULL"<<endl;
    return os;
 }

メイン関数で、SavingAccount クラスのオブジェクトを持つリストを作成しました

LinkedList <SavingAccount> list;

エラーは、次の行の main 関数で発生します。

 cout << list <<endl;

まあ..これはLinkedListクラスの実装です:

#include "LinkedList.h"
#include "SavingAccount.h"
#include <cstddef>
using namespace std;

template <typename T>
LinkedList<T>::LinkedList()
{
   start = NULL;
   current = NULL;
}
template <typename T>
LinkedList<T>::~LinkedList()
  {
    // Add code.
  }

  template <typename T>
   std::ostream& operator<< (std::ostream& os,const LinkedList<T>& list) {
    list.current = list.start;
    while(list.current != NULL)
    {
        os<< list.current->info<<" -> ";
        list.current = list.current->next;
    }
    os<<"NULL"<<endl;
    return os;
  }

これは LinkedLins クラスのヘッダー ファイルです。

#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#include<iostream>

using namespace std;


template <typename T>
struct Node{
    T info;
    Node<T> *next;
};

template <typename T>

class LinkedList
{
    Node<T> *start;
    Node<T> *current;
public:
    LinkedList();
    ~LinkedList();
    friend std::ostream& operator<< (std::ostream& os, const LinkedList<T>& list);

  };

#endif // LINKEDLIST_H

皆さんが私を助けてくれることを願っています、あなたの助けは大歓迎です


今日、非常によく似た問題に遭遇しました。

ボタンの可視性が可視性コンバーターによって折りたたまれた状態に設定されている場合、「時々」CanExecute バインディングが無視されます。「ときどき」と言ったのは、可視性コンバーターにブレークポイントを設定すると、動作が変わるためです。

可視性が Visible に変更されると、CanExecute は再度呼び出されません。UI の任意の場所をマウスでクリックすると、CanExecute バインディングが更新され、期待どおりに動作します。

この問題を回避するには、Button IsEnabled プロパティをビューモデルのプロパティに直接バインドします。これは、CanExecute の動作を反映しています。

4

3 に答える 3

1

これがエラーの原因かどうかはわかりませんが、関数定義が関数宣言とは異なります。

// you left out a & (reference sign) - LinkedList<T>& list in declaration
std::ostream& operator<< (std::ostream& os, LinkedList<T> list) 

編集

Petr Budnikの言うとおりです。テンプレートの実装を定義と同じファイルに保持する必要があります。

彼が言及しなかったことが 1 つあります (そして、おそらく問題を引き起こしている可能性があります):オーバーロードのtemplate T上で a を使用していることを明示する必要があります。<<

template < typename T>
friend std::ostream& operator<< (std::ostream& os, LinkedList<T>& list);

また、渡したconstを変更する予定がある場合は削除してください。LinkedList

これは(大まかに)あなたLinkedList.hがどのように見えるべきかです:

template <typename T>
struct Node{
    T info;
    Node<T> *next;
};

template <typename T>
class LinkedList
{
    Node<T> *start;
    Node<T> *current;
public:
    LinkedList();
    ~LinkedList();

    template < typename T>
    friend std::ostream& operator<< (std::ostream& os, LinkedList<T>& list);


};

template <typename T>
LinkedList<T>::LinkedList()
{
    start = NULL;
    current = NULL;
}

template <typename T>
LinkedList<T>::~LinkedList()
{
    // Add code.
}

template <typename T>
std::ostream& operator<<(std::ostream& os, LinkedList<T>& list) {
    list.current = list.start;
    while (list.current != NULL)
    {
        os << list.current->info << " -> ";
        list.current = list.current->next;
    }
    os << "NULL" << endl;
    return os;
}    

PS

nullptrまたはの代わりに使用することをお勧めします0NULL? これは新しい C++11 構文であり、いくつかの利点があります (必要に応じて読んでください)。

お役に立てれば!

于 2013-08-16T12:39:56.087 に答える
0

非常に病的なケースを除けば、「出力」操作は出力される値を変更してはならないため、適切な関数プロトタイプは

template<class T>
std::ostream& operator<<(std::ostream& s, const LinkedList<T>& list)
{
...
}

listまた、メンバーに新しい値を割り当てるべきではありません(のようにlist.current = list.start)。ロジックも考え直したほうがいいですよね…

また、テンプレート関数は cpp ファイルではなくヘッダーに実装する必要があります

于 2013-08-16T12:45:28.010 に答える