2012-05-05 2 views
1

У меня есть шаблонный класс Node, и я хочу создать массив своего объекта и передать его функции. Как мне это сделать?Массив объектов как аргумент функции error в C++

Node<char> w1, w2, w3, w4; 
Node<char> **s1 = new Node<char>* [3]; 
s1[0] = &w1; s1[1] = &w2; s1[2] = &w3; 
w4.meet_neighbors(s1); 

, где у меня есть следующий прототип до:

template<typename T> 
void Node<T>::meet_neighbors(Node<T>**); 

зондирующего сделать это таким образом приводит к следующей ошибке:

error: no matching function for call to ‘Node<char>::meet_neighbors(Node<char>**&) 
note: candidates are: void Node<TW>::meet_neighbors(const Node<TW>**) [with TW = char] <near match> 

, исход которого я не понимаю. Пожалуйста помоги.

+2

Вы не выделили памяти для 's1'; в то время как ваша ошибка напрямую не связана с этим, она спасает вас от дампа ядра. – geekosaur

+0

спасибо, но он все же не решает проблему. любые дальнейшие намеки? –

+0

Вы уверены, что у вас есть 'include's correct? Вы пытались помещать объявление функции прямо над вызовом функции, чтобы узнать, работает ли он? – Shahbaz

ответ

2

Две функции differenet, не потому, что есть в журнале ошибок дополнительный &, а потому, что один из них является const указатель, а другой нет.

В журналах ошибок C++ (по крайней мере, G ++), даже f(int) показывает, как f(int&).

0

Вам нужно сделать что-то вроде этого:

Node<char>** s1 = new Node<char>*[4]; 
s1[0] = &w1; s1[1] = &w2; s1[2] = &w3; 
w4.meet_neighbors(s1); Node<T>::meet_neighbors(Node<T>**); 
/*...*/ 
delete[] s1; 

Но вы действительно должны рассмотреть возможность использования некоторых STL контейнеров вместо массивов, как станд :: вектор. Вы можете заметить, что ваша функция meet_neighbors() не может определить размер аргумента массива. Вам нужно либо передать какой-то контейнер, либо добавить аргумент размера массива.

+3

Пожалуйста! Измените 'delete s1;' на 'delete [] s1;'. Бог сохранит весь ваш предыдущий код. – Shahbaz

+0

@Shahbaz Упс, действительно. –

+0

Здесь есть тифа: «функция должна быть объявлена ​​как узел :: meet_neighbors (T **)« правильно? Потому что мне скорее понадобится Node ** ... Но тогда это будет именно так, как я уже говорил. Если выделение памяти на s1 было для ее решения, это не так. –