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

解决静态函数调用错误
本文介绍了解决静态函数在跨文件调用时出现的已声明但未定义错误的方法,通过将静态函数封装为普通函数的形式,实现了不同文件间的正确调用。

由于实验的需要,要改动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
这样就没问题了~~~~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值