【问题标题】:Yet another uresolved external case又一个未解决的外部案例
【发布时间】:2012-04-24 18:32:04
【问题描述】:

第一次问。

这是交易:

我有一个辅助类(至少现在它是一个类),它有几个数学函数,我在整个项目中都会用到。

#ifndef CUSTOM_UTILS_H
#define CUSTOM_UTILS_H
//---------------------------------------------------------
#include <stdlib.h>
#define _USE_MATH_DEFINES
#include <math.h>

class cUtil {
public:
static int utilsRandom(int from, int to);
static double utilsRandom(double from, double to);
static double giveAngle(double x, double y);
static double FoV(double cx, double cy, 
    double fx, double fy, 
    double tx, double ty, 
    double radius);
};
//---------------------------------------------------------
#endif 

实施:

#define _USE_MATH_DEFINES
#include "customUtils.h"
//---------------------------------------------------------
int cUtil::utilsRandom(int from, int to) {
if (from == to) {
    return from;
}
return (rand() % (to - from)) + from;
}
//---------------------------------------------------------
double cUtil::utilsRandom(double from, double to) {
  ...
}
//---------------------------------------------------------
double cUtil::giveAngle(double x, double y) {
  ...
}
//---------------------------------------------------------
double cUtil::FoV(double cx, double cy, 
double fx, double fy, 
double tx, double ty, 
double radius) {
  ...
}
//---------------------------------------------------------

(删除了 3 个主体以节省帖子空间)

现在,当我使用它时,假设在一个名为“creature”的类中,我将 customUtils.h 文件包含在“creature”的标题中。并使用以下 4 个函数中的任何一个:cUtil::func_name()。 有时我会遇到未解决的外部错误,例如

LNK2001: unresolved external symbol "public: static double __cdecl cUtil::utilsRandom
(double,double)" (?utilsRandom@cUtil@@SANNN@Z)  C:\Users\Rockstrongo\Documents\Projects
\nnEvo\nnEvo\net.obj

它出现在 cUtil 中的所有函数以及使用这些函数的所有类中。

我说它有时会出现,因为它就是这样做的 - 我将重建项目并且它会重新出现。为了再次清理它,我会更改 cUtils 代码的某些部分,或者它包含在其他类中的方式,或者任何让它再次运行的东西。有一段时间,清理-> 编译 customUtils.cpp-> 然后构建其余的工作,但不再工作。

对于像我这样未经训练的眼睛来说,这似乎完全是随机的,我已经竭尽全力去抓住。我正在使用 Microsoft Visual Studio 2010。这是一个使用 openGL 和 glut 的控制台项目。

【问题讨论】:

    标签: unresolved-external


    【解决方案1】:

    我看到你重载了 cUtil::utilsRandom 以使用双精度和整数。没关系,除了一件事:您不能更改返回的类型。两个重载版本都必须返回一个 int 或一个 double。如果您必须具有不同的返回类型,则不要重载该函数。而是使用不同的函数名。

    【讨论】:

    • 我已将我的函数分别更改为 utilsRandomInt 和 utilsRandomDouble。为什么不能为重载函数设置不同的返回类型?另外我认为这无意中解决了“我的程序在发布模式下崩溃”的问题。
    • 这是一个编译器实现问题,它不能根据返回的类型在函数之间有所不同。我不认为这是不可取的,但这就是它在 C++ 中的工作方式。
    猜你喜欢
    • 2012-02-25
    • 2017-07-09
    • 2021-12-27
    • 2015-01-11
    • 2016-01-20
    相关资源
    最近更新 更多