1

私はこれが以前にいくつかの質問でカバーされていなかったことを望みます。できる限り見た目は良かったのですが、そもそも何が起きているのかわからず、前の答えが見つからなかったのかもしれません。もしそうならお詫びしますが、そうでなければ...

テンプレートを使って練習し、C ++とコード設計をよりよく理解するために、リンクリストの(現在は非常に単純な)実装を作成し、主にstd::listを模倣しようとしています。私はイテレータと他のコンポーネントを論理的に実装することに取り組んできましたが、問題にぶつかりました。どこかにテンプレート構文があると思いますが、よくわかりません。それはただのばかげた間違いかもしれません。

クラスの一般的な構造は次のとおりです。

template <class T>
class LinkedList {
public:
    LinkedList();
    class Iterator;
    void push_front(const T&);
    void push_back(const T&);
    void pop_front();
    void pop_back();
    T& front();
    T& back();
    unsigned int size() const;
    bool empty() const;
    Iterator begin();
    Iterator end();
private:
    struct ListNode;
    ListNode* m_front;
    ListNode* m_back;
    unsigned int m_size;
};

template <class T>
class LinkedList<T>::Iterator {
public:
    Iterator();
    Iterator(const Iterator& rhs);
    Iterator(ListNode* const& node);
    Iterator operator=(const Iterator& rhs);
    T& operator*();
    bool operator==(const Iterator& rhs) const;
    bool operator!=(const Iterator& rhs) const;
    Iterator operator++();
private:
    ListNode* m_node;
};

template <class T>
struct LinkedList<T>::ListNode {
    T* m_data;
    ListNode* m_next;
};

そして、ここに問題のある関数があります:

template <class T>
void LinkedList<T>::push_front(const T&) {
    if (m_front == NULL) {
        m_front = new ListNode;
        *(m_front->m_data) = T;
        m_front->m_next = NULL;
        m_back = m_front;
    } else if (m_front == m_back) {
        m_front = new ListNode;
        *(m_front->m_data) = T;
        m_front->m_next = m_back;
    } else {
        ListNode* former_front(m_front);
        m_front = new ListNode;
        *(m_front->m_data) = T;
        m_front->m_next = former_front;
    }
}

そして、GCC 4.6.3によって与えられたエラー:

linkedlist.hpp: In member function ‘void pract::LinkedList<T>::push_front(const T&)’:
linkedlist.hpp:75:31: error: expected primary-expression before ‘;’ token
linkedlist.hpp:80:31: error: expected primary-expression before ‘;’ token
linkedlist.hpp:85:31: error: expected primary-expression before ‘;’ token

それがお役に立てば幸いですが、他に何か望ましいことがあれば、ぜひ質問してください。皆さんありがとう。

4

1 に答える 1

1

問題はこれらの行にあります:

*(m_front->m_data) = T;

これは、変数に型を割り当てようとしていますが、これは明らかに不可能です。おそらく、名前付き引数が必要であり、この割り当てにその引数を使用する必要があります。

template <class T>
void LinkedList<T>::push_front(const T& t) {
    if (m_front == NULL) {
        m_front = new ListNode;
        *(m_front->m_data) = t;
        m_front->m_next = NULL;
        m_back = m_front;
    } else if (m_front == m_back) {
        m_front = new ListNode;
        *(m_front->m_data) = t;
        m_front->m_next = m_back;
    } else {
        ListNode* former_front(m_front);
        m_front = new ListNode;
        *(m_front->m_data) = t;
        m_front->m_next = former_front;
    }
}
于 2012-10-06T01:46:01.487 に答える