error c2129 靜態函式已宣告但未定義

2021-06-27 10:21:35 字數 1176 閱讀 5712

由於實驗的需要,要改動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

using namespace  std;

static void printstatic();

#endif

2. 對應的printstatic.cpp 定義的函式如下

#include "stdafx.h"

#include "printstatic.h"

static void printstatic()

3. 在主程式中呼叫這個靜態函式

#include "stdafx.h"

#include

#include "printstatic.h"

using namespace std;

int _tmain(int argc, _tchar* argv)

那麼此時,就會出現「

靜態函式已宣告但未定義的錯誤。」

怎麼解決呢? 很簡單用一般的函式封裝這個靜態函式,引數一一對應即可,在

printstatic.h 增加這個封裝的函式的宣告,

然後在在

printstatic.cpp 新增這個函式的實現,其實就是呼叫這個靜態函式

最後在主程式呼叫

ok,編譯通過,順利執行,輸出static

這樣就沒問題了~~~~

靜態函式與非靜態函式的區別

靜態成員函式和非靜態成員函式的根本區別在於有無this指標。非靜態函式由物件名或者物件指標 呼叫,呼叫時編譯器會向函式傳遞this指標 靜態成員函式則由類名 或者物件名呼叫 非靜態函式中有this指標,靜態函式中沒有this指標,不能訪問物件的成員函式,成員函式有this指標,const修飾this...

c靜態函式

c程式一直由下列部分組成 1 正文段 cpu執行的機器指令部分 乙個程式只有乙個副本 唯讀,防止程式由於意外事故而修改自身指令 2 初始化資料段 資料段 在程式中所有賦了初值的全域性變數,存放在這裡。3 非初始化資料段 bss段 在程式中沒有初始化的全域性變數 核心將此段初始化為0。5 堆 動態儲存...

靜態函式呼叫

include class point static void init 靜態成員函式 呼叫1 非靜態成員函式和非靜態成員屬於物件的方法和資料,也就是先產生類的物件,然後通過類的物件去引用。void main 呼叫2 靜態成員函式和靜態成員變數屬於類本身,在類載入的時候,即為它們分配了空間,所以可通...