我有两个文件:.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
我做错了什么?我可以在需要时发布更多代码。
答案 0 :(得分: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) {
// ...
}
答案 1 :(得分: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();
};
Bad MyClass.cpp
#include "MyClass.hpp"
void doSomething() // not qualified properly
{
// insert code here
}
Good MyClass.cpp
#include "MyClass.hpp"
void MyClass::doSomething() // now qualified properly
{
// insert code here
}