У меня есть два файла:.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);
но я получаю следующую ошибку от g++:
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
Что я делаю не так? При необходимости я могу разместить больше кода.
Неопределенная ссылка на 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) {
// ...
}
Неопределенная ссылка часто означает, что вы забыли добавить реализацию для функции, которую вы пытаетесь вызвать.
Например:
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();
};
Bad MyClass.cpp
#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
}
Knoten::
в вашем .cpp, но в вашем заголовке есть только имя функции.