2013-04-01 62 views
0

gcnew操作我有以下簡單的類泛型類型

generic<typename T> where T:IDbConnection ref class CDbConnection 
{ 
private:  
    IDbConnection^m_db; 

    ConnectionState^ m_originalConnState; 
public: 
    CDbConnection(); 
    bool Connect(String^connStr); 
    bool Exists(int id); 
    auto GetAllData(String^ tableStr); 
    ~CDbConnection(); 
    !CDbConnection(); 
}; 

,這裏是我的構造

generic<typename T> CDbConnection<T>::CDbConnection() 
{ 
    m_db=gcnew T(); 
    m_originalConnState=m_db->State; 
} 

但是編譯器會抱怨< 1> gcnew T()不能使用對於通用型 < 2>auto使用中的關鍵是錯誤的功能expects a trailing return type

+0

爲什麼你聲明你的成員'm_db'爲'IDbConnection',而把它當作一個泛型使用'm_db = gcnew T()'? –

+0

謝謝,我想稍後再做這樣的'''m_db = gcnew SqlConnection()/ OracleConnection()/ DbOleConnection();''etc –

回答

1

爲了交流hieve泛型,您必須在類定義更改爲

generic<typename T> where T:IDbConnection ref class CDbConnection 
{ 
private:  

    T m_db; 
    ConnectionState^ m_originalConnState; 

public: 

    CDbConnection(); 
    bool Connect(String^connStr); 
    bool Exists(int id); 
    auto GetAllData(String^ tableStr); 
    ~CDbConnection(); 
    !CDbConnection(); 
}; 

因爲你已經限制你的T至少爲IDbConnection它不可能是別的。 那麼你的構造

generic<typename T> CDbConnection<T>::CDbConnection() 
{ 
    m_originalConnState=m_db.State; 
} 

應該像你預期的。

編輯

看來你不能聲明對泛型的引用。如果將對象分配給堆棧,它將起作用。 請參閱this條目。

// C3229.cpp 
// compile with: /clr /c 
generic <class T> 
ref class C { 
    T^ t; // C3229 
}; 

// OK 
generic <class T> 
ref class D { 
    T u; 
}; 
+0

謝謝,但它會導致一個新的錯誤,輸入參數是不允許的「' –

0

謝謝您的閱讀和回覆

我忘了這 where T:IDbConnection, gcnew() 這是完全一樣的C#泛型

如上所述擺脫gcnew錯誤的。

+0

'2天內不能投票給我自己的答案:-D –

+0

通過內聯編寫代碼來進入成功的陷阱。 C++/CLI通常不需要將聲明從類的定義中分離出來,而是用匯編元數據替換頭文件。 –