泛型类型的gcnew运算符

时间:2013-04-01 08:40:29

标签: c++ c++-cli

我有以下简单类

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

但编译器抱怨&lt; 1&gt; gcnew T()不能用于泛型类型 &LT 2 - ;使用的auto密钥错误为函数expects a trailing return type

2 个答案:

答案 0 :(得分:1)

为了实现通用性,您必须将类定义更改为

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

答案 1 :(得分:1)

感谢您的阅读和回复

我忘记了这一点 where T:IDbConnection, gcnew() 这与C#generics

完全相同

如上所述摆脱gcnew错误。