2013-04-01 61 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通常不需要将声明从类的定义中分离出来,而是用汇编元数据替换头文件。 –