编译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_ */
谁能告诉我错误在哪里?
答案 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>