gcnew operator for generic type

孤街浪徒 提交于 2019-12-25 05:01:59

问题


I have the following simple class

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();
};

and here is my constructor

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

But the compiler complains <1> the gcnew T() can't be used for generic type <2> auto key in use is wrong as the function expects a trailing return type


回答1:


Thank you for your reading and replies

I forgot this where T:IDbConnection, gcnew() which is exactly the same as C# generics

to get rid of the gcnew error as stated above.




回答2:


In order to achieve genericity, you must change your class definition to

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();
};

As you are already constraining your T to be at least IDbConnection it can't be anything else. Then your constructor

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

should work like you intended.

EDIT

It seems you cannot declare a reference to a generic. If you assign the object to the stack it will work. See this entry.

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

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


来源:https://stackoverflow.com/questions/15740228/gcnew-operator-for-generic-type

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!