现在的位置: 首页 > 综合 > 正文

error c2129:静态函数已声明但未定义

2017年12月19日 ⁄ 综合 ⁄ 共 1069字 ⁄ 字号 评论关闭

由于实验的需要,要改动OpenCV中混合高斯模型的代码,由于担心重新编译OpenCV项目麻烦,于是自己建立新的源文件,利用它里面的一些源代码,OpenCV混合高斯模型主要在。。。\src\cvaux\vs\bgfg_estimation.cpp以及。。。\src\cvaux\cvbgfg_gaussmix.cpp中实现。将其代码拷贝过来,修改以后编译出现error c2129:静态函数已声明但未定义的错误。。

查看上面两个文件,其实现都是以static函数进行的,由于:“静态函数只能在声明它的文件当中可见,不能被其他文件所调用,也就是说该静态函数只能在其定义的.cpp或.c中调用,在其它.cpp或.c文件的函数里是不能被调用的。”

解决方案: 对静态函数一般函数形式的封装,只需对那些对外提供接口的静态函数进行封装,每一个静态接口函数对应一个封装的一般形式的函数,调用时,调用这些封装函数即可。



////给一个实际的例子

比如:

1. printStatic.h文件如下,

 

#ifndef  STATIC_TEST

#define  STATIC_TEST

#include <iostream>

using namespace  std;

static void printStatic();

#endif

2. 对应的printStatic.cpp 定义的函数如下

#include "stdafx.h"

#include "printStatic.h"

static void printStatic()

{

  cout<<"static"<<endl;

}

3. 在主程序中调用这个静态函数

#include "stdafx.h"

#include <iostream>

#include "printStatic.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

printStatic();

 int x;

 cin>>x;

return 0;

}

那么此时,就会出现“静态函数已声明但未定义的错误
怎么解决呢? 很简单用一般的函数封装这个静态函数,参数一一对应即可,在printStatic.h 增加这个封装的函数的声明,
void printStaticWrapper();
然后在在printStatic.cpp 添加这个函数的实现,其实就是调用这个静态函数
void printStaticWrapper()
{
printStatic();
}
最后在主程序调用
printStaticWrapper();
ok,编译通过,顺利运行,输出static
这样就没问题了~~~~
【上篇】
【下篇】

抱歉!评论已关闭.