Использование структур в качестве параметров и доступ к их элементам в шаблонном классе - PullRequest
0 голосов
/ 23 октября 2011

У меня есть шаблонный класс btree и я определил struct Node в открытых определениях файла заголовка

struct Node {
    vector<Node> chi_;
    vector<T> val_;
    Node *par_;

    Node(size_t n, Node *parent) : par_(parent) {
        chi_.reserve(n+1);
        val_.reserve(n);
    }
    ~Node() {
        chi_.clear();
        val_.clear();
    }
};

Как и мой конструктор оператора / / copy, я хочу создать рекурсивную функцию addAll'

template <typename T>
void btree<T>::addAll(struct Node* &one, struct Node* const& two) {

    for(unsigned int a = 0; a < two.val_.size(); a++)
        one.val_.push_back(two.val_.at(a));

    for(unsigned int a = 0; a < two.chi_.size(); a++) {
        Node *newNode = new Node(max, one);
        addAll(newNode, two.chi_.at(a));
        one.chi_.push_back(newNode);
    }
}

Объявление функции странно для меня - я попробовал что-то простое, например btree: addAll (Node & one, const Node & two), но это породило довольно много трудных для понимания ошибок компилятора, но я наконец-то получилчтобы принять существование указанной функции, объявив ее выше + имеющей

void addAll(struct Node*&, struct Node* const&);

в моем заголовочном файле.

Проблема, с которой я столкнулся сейчас, заключается в доступе к элементам данныхУзел внутри моей функции, я получаю следующую ошибку компиляции:

btree.tem:28:23: error: request for member 'val_' in 'two', which is of non-class type 'btree<long int>::Node* const'
btree.tem:29:3: error: request for member 'val_' in 'one', which is of non-class type 'btree<long int>::Node*'
btree.tem:29:3: error: request for member 'val_' in 'two', which is of non-class type 'btree<long int>::Node* const'
btree.tem:31:23: error: request for member 'chi_' in 'two', which is of non-class type 'btree<long int>::Node* const'
btree.tem:33:3: error: request for member 'chi_' in 'two', which is of non-class type 'btree<long int>::Node* const'
btree.tem:34:3: error: request for member 'chi_' in 'one', which is of non-class type 'btree<long int>::Node*'

Не совсем уверен, правильно ли я здесь заявляю или нет, но эта конкретная проблема действительно ставит меня в тупик (приближается день иполовина разных подходов возиться с ним, но безрезультатно)

Ответы [ 3 ]

0 голосов
/ 23 октября 2011

вы создали для добавления всех функций одну, которая является частью вашего класса btree, а другую - просто функцию вне класса.Вы представляете, что класс определяется как шаблон, но ваш класс узлов - это тот, на который ссылается тип T. Если дерево b может принять больше, чем узел, то при добавлении всех следует ссылаться на T, а не на узел, если он может использовать толькокласс узла это не должен быть шаблон.

0 голосов
/ 23 октября 2011

one и two являются ссылками на указатели, поэтому вам нужно использовать оператор -> для доступа к членам.

one->val_.push_back(two->val_.at(a));

Кроме того, в C ++ вам не нужно использоватьключевое слово struct при ссылке на тип.

template <typename T>
void btree<T>::addAll(Node* &one, Node* const& two)
0 голосов
/ 23 октября 2011

Вы должны использовать -> при разыменовании указателя на класс.

Например:

for(unsigned int a = 0; a < two->val_.size(); a++)
    one->val_.push_back(two->val_.at(a));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...