函数调用另一个函数

时间:2014-02-02 16:51:32

标签: c++

我有两个文件:.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

我做错了什么?我可以在需要时发布更多代码。

2 个答案:

答案 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
}