错误:C ++中对'function'的未定义引用

时间:2011-02-20 09:34:51

标签: c++

编译C ++时遇到错误:

/tmp/ccqs6UN2.o: In function `main': PowerModulus.cpp:(.text+0x194): undefined reference to `takeModulusLOOP(int, int, int)' collect2: ld returned 1 exit status

源代码:

#include "PowerModulus.h"
#include <iostream>
int modint(int x, int moduint);
int takeModulusLOOP(int x, int n, int moduint);

int main(){
    std::cout << takeModulusLOOP(5348,700,335);
}

int PowerModulus::takeModulusLOOP(int x, int n, int moduint){
    int total = modint(x, moduint) ;
    n--;
    while (--n){
        total = modint( total * x, moduint );
    }
    return total;
}

int PowerModulus::modint(int x, int moduint){
    while ( x < 0) // deal with negative
        x += moduint;
    return x % moduint;//comes out positive now -> %
}

PowerModulus::PowerModulus() {
    // TODO Auto-generated constructor stub

}

PowerModulus::~PowerModulus() {
    // TODO Auto-generated destructor stub
}

标题文件:

#ifndef POWERMODULUS_H_
#define POWERMODULUS_H_
int modint(int x, int moduint);
int takeModulusLOOP(int x, int n, int moduint);

class PowerModulus {
public:
    int takeModulusLOOP(int x, int n, int moduint);
    int modint(int x, int moduint);
    PowerModulus();
    virtual ~PowerModulus();
};

#endif /* POWERMODULUS_H_ */

谁能告诉我错误在哪里?

4 个答案:

答案 0 :(得分:3)

您已声明了全局 takeModulusLOOP函数,然后在main中调用它,而无需定义它。这是与PowerModulus :: takeModulusLOOP不同的功能。

// main.cpp
#include "PowerModulus.h"
#include <iostream>

int main(){
    std::cout << PowerModulus::takeModulusLOOP(5348,700,335) << '\n';
    return 0;
}

更改为命名空间而不是类,并分为标题和实现(而不是在main.cpp中分组):

// PowerModulus.cpp
#include "PowerModulus.h"

namespace PowerModulus {

int takeModulusLOOP(int x, int n, int moduint){
    int total = modint(x, moduint) ;
    n--;
    while (--n){
        total = modint( total * x, moduint );
    }
    return total;
}

int modint(int x, int moduint){
    while ( x < 0) // deal with negative
        x += moduint;
    return x % moduint;//comes out positive now -> %
}

}

部首:

// PowerModulus.h
#ifndef POWERMODULUS_H_
#define POWERMODULUS_H_

namespace PowerModulus {

int modint(int x, int moduint);
int takeModulusLOOP(int x, int n, int moduint);

}

#endif

答案 1 :(得分:2)

这一行:

std::cout << takeModulusLOOP(5348,700,335);

正在调用您未在任何地方定义的非类takeModulusLOOP

您应该通过提供类类型的对象并使用类似以下内容来调用类版本:

PowerModulus p;
std::cout << p.takeModulusLOOP(5348,700,335);

(最有可能)或提供非等级版本(最不可能)。

您还可以考虑将该函数设置为静态,因为它似乎根本不需要对象。然后你不需要实例化一个。

答案 2 :(得分:2)

您收到错误是因为您没有这样的功能。 实际上你在PowerModulus类中有它,所以你应该从PowerModulus实例调用该函数。

PowerModulus pM;
pM.takeModulusLoop(5348,700,335);

您无需在.h文件的开头或.cpp文件的开头声明该功能

答案 3 :(得分:0)

如果您打算使用PowerModulus类的takeModulusLoop函数,则无需再次声明全局函数。但是,如果您打算使用不同的全局函数,则需要在其上下文中定义它。 / p>