0

リンクされたリスト クラス List があります。そのためのコピーコンストラクターを作成する必要があります。私は実際に構文に問題があります。ここに私のコードがあります:

template <class T>
List<T>::List(const List<T>& otherList)
{
}

otherList は List 型の別の項目です。実際、それはリストへのポインタだと思います。クラス List に対して定義された getHead() 関数があり、正常に動作します。私は次のことをしても大丈夫だと思いました:

Node* temp = otherList->getHead();

node は、List を構成するポインタです。これは別のクラス ノードです。しかし、上記を実行するとエラーが発生します:

base operand of -> has non-pointer type const List<int> 

だから私は「。」を使ってみました。上記の式の「->」の代わりに。次のエラーが発生しました:

passing const List<int> as this argument of ListItem<T>* List<T>::getHead() [with T = int] discards qualifiers [-fpermissive]

私の getHead 関数:

template <class T>
node<T>* List<T>::getHead()
{
return head;
}

親切に私を導いてください

4

2 に答える 2

2

まず、otherListはポインタではなく、「への参照const List<T>」です。&その型が であるため、参照であることはわかっています。*ポインターの場合、その型には a があります。参照は、オブジェクト自体を持っているかのように動作します。したがって.、メンバー関数にアクセスするために使用するのgetHeadは正しいです。

ここでの問題は、参照があるが、非メンバー関数constを呼び出していることです。constコンパイラに関する限り、getHead関数は を変更する可能性があるため、Listで呼び出すべきではありませんconst ListgetHeadとして宣言する必要がありconstます。の宣言があるところはどこでも、関数を開始するの前にgetHeada を貼り付けます。const{

template <typename T>
const Node<T>* List<T>::getHead() const {
  // ...
}

getHeadこれは、が実際にリストを変更しないことを前提としています (変更すべきではありません)。もしそうなら、それをconstメンバー関数にすることはできず、コピーコンストラクターから呼び出すことはできませotherListconst. ただし、コピー コンストラクターは、コピーしているオブジェクトを変更してはならないotherList ためconst.

于 2013-02-07T19:00:21.610 に答える
0

const 関数として宣言する必要があるような気がしgetHead()ます... 試してみて、動作するかどうかをお知らせください。

于 2013-02-07T19:00:38.947 に答える