2012-11-28 188 views
1

我的程序包含兩個主要部分。第一個是DLL中的C++類定義,另一個是核心程序。在每個DLL加載到核心程序後,代理類將填充類描述到核心程序中的數據結構中,這通過使用關鍵字「extern」來解決。C++中的前向聲明

我得到了一個聲明順序問題錯誤消息。代碼行中的 :「typedef map method_map;」 1.錯誤:「代理」在此範圍內未聲明 2.錯誤:模板參數2是在代碼行無效:

typedef common_object *maker_t(); 
extern map< string, maker_t* > factory; 


//This method_map is used to store all the method structure data of each class 
//method: class_name, method_name, function pointer 
//I got two errors here: 
//1. "ERROR: ‘proxy’ was not declared in this scope" 
//2. "ERROR: ‘error: template argument 2 is invalid" 
typedef map<string, proxy::method> method_map; 
//this class_map contain the methods description for each class. 
//this class_map is declared in the core program. 
//after the class in this dll is loaded on the core program, 
//it would automatically fill its descriptino in here 
extern map<string, method_map> class_map_; 

// our global factory 
template<typename T> 
class proxy { 
public: 
typedef int (T::*mfp)(lua_State *L); 
typedef struct { 
    const char *class_name; 
    const char *method_name; 
    mfp mfunc; 
} method; 

proxy() { 
    std::cout << "circle proxy" << endl; 
    // the loop for filling the methods information of the class T 
    method_map method_map_; 
    for (method *m = T::methods;m->method_name; m++) { 
     method m1; //specific information about each method 
     m1.class_name = T::className; 
     m1.method_name = m->method_name; 
     m1.mfunc = m->mfunc; 
     method_map_[m1.method_name] = m1; //assign m1 into the method map 
    } 
    //Assign methods description of the T class into the class_map 
    class_map_[T::class_name] = method_map_; 
} 
};  

我希望能看到你的建議這個問題。非常感謝!

回答

1

method_mapclass_map_將需要被嵌套在proxy(或一些其它的模板),因爲它們依賴於另一個嵌套類型(method),而這又取決於模板參數。

如果他們沒有(例如,如果proxy是一個類而不是模板),那麼他們需要在proxy之後聲明以便使用在那裏聲明的類型。

+0

非常感謝。我試圖在類代理中聲明class_map_,但是由於class_map_的聲明中出現了錯誤,所以聲明瞭關鍵字「extern」,它不能放在類中。你能否提供一些其他建議?我希望很快看到你的回覆。 – khanhhh89

0

向前定義/聲明class proxy;typedef map<string, proxy::method> method_map;

像這樣:

template<class T> 
    class proxy; 
    typedef map<string, proxy::method> method_map; 
+0

這將如何工作?編譯器如何知道'proxy'中的'method'是什麼。 – Dani

+0

@Dani通過稱爲界面的東西。 –

+0

@Aniket:我試過你的解決方案如下:t模板 類代理; typedef map method_map;但在代碼行「typedef ...」中收到了同樣的錯誤消息「template argument 2 is invalid」。我認爲原因是proxy :: method需要一個模板參數。你能否提供另外的建議。非常感謝! – khanhhh89