2014-02-02 7 views
0

У меня есть два файла: .cpp и .hpp-файл. В файле .hpp есть класс с именем Knoten и определения общественной функции:Функция вызова внутри другой функции

static void faerbe_algorithmus(bool jsp[5][5], std::list< std::list<int> > &liste_von_str_orth_spalten); 

В файле .cpp я пытаюсь вызвать функцию в другой функции (compute_J), как это:

Knoten::faerbe_algorithmus(jsp, liste_von_str_orth_spalten); 

, но я получаю следующее сообщение об ошибке с г ++:

In function `compute_J(double*, double (*) [5])': 
11_3.cpp:(.text+0x3fc): undefined reference to `Knoten::faerbe_algorithmus(bool (*) [5], std::list<std::list<int, std::allocator<int> >, std::allocator<std::list<int, std::allocator<int> > > >&)' 
collect2: error: ld returned 1 exit status 

Что я делаю неправильно? При необходимости я могу разместить больше кода.

+0

ли Knoten пространство имен? У вас есть «Knoten ::' в вашем .cpp, но в вашем заголовке есть только имя функции. – Brandon

+0

Не уверен, почему вызов функции из другой функции - это то, на что вы фокусируетесь. Запрет статической инициализации - это метод _only_ для вызова функции. Проблема заключается в вашей _undefined reference_. –

+0

@ KonradRudolph: Я предлагаю прочитать Meta-сообщение в часто задаваемых вопросах C++. –

ответ

0

неопределенная ссылка на Knoten :: faerbe_algorithmus

ли признак того, что вам не хватает определение статической публичной функции. Вы либо забыли определить его с помощью:

void Knoten::faerbe_algorithmus(bool jsp[5][5], std::list< std::list<int> > &liste_von_str_orth_spalten) { 
    // ... 
} 

или вы не указали правильное определение.


На стороне записки, я предлагаю вам отказаться от массивов C-стиля и начать использовать std::array вместо этого. Это сэкономит вам массу неприятностей, особенно с массивом на размытие указателя. Вот соответствующая версия:

void Knoten::faerbe_algorithmus(const std::array<std::array<bool, 5>, 5>& jsp, std::list< std::list<int> > &liste_von_str_orth_spalten) { 
    // ... 
} 

Я знаю, что это, вероятно, труднее писать, но вы можете создать псевдоним для него:

template<class Type, std::size_t Size> 
using bidim = std::array<std::array<Type, Size>, Size> 

и использовать его как:

void Knoten::faerbe_algorithmus(const bidim<bool, 5>& jsp, std::list< std::list<int> > &liste_von_str_orth_spalten) { 
    // ... 
} 
+0

Это помогло ошибке. Спасибо ! – user2989325

0

Неопределенная ссылка часто означает, что вы забыли добавить реализацию для функции, которую вы пытаетесь вызвать.

Например:

Bad foo.cpp

void doSomething(); 

int main() 
{ 
    doSomething(); // undefined reference, there is no implementation 
} 

Хорошо foo.cpp

void doSomething(); 

int main() 
{ 
    doSomething(); // this is OK, as the function is implemented later on 
} 

void doSomething() 
{ 
    // insert code here 
} 

Если вы реализовали функцию где-нибудь, проверьте имя является правильно.

Например (относится к обоим классам пространств имен и/структуры):

MyClass.hpp

class MyClass 
{ 
public: 
    static void doSomething(); 
}; 

Плохой МойКласс.каст

#include "MyClass.hpp" 

void doSomething() // not qualified properly 
{ 
    // insert code here 
} 

Хорошо MyClass.cpp

#include "MyClass.hpp" 

void MyClass::doSomething() // now qualified properly 
{ 
    // insert code here 
} 
Смежные вопросы