0

我有以下简单的课程

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() can't be used for generic type <2> autokey in use is wrong as the functionexpects a trailing return type

4

2 回答 2

1

感谢您的阅读和回复

我忘记了,这 where T:IDbConnection, gcnew() 与 C# 泛型完全相同

摆脱上述gcnew错误。

于 2013-04-01T09:55:38.800 回答
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;
}

应该像您预期的那样工作。

编辑

看来您不能声明对泛型的引用。如果您将对象分配给堆栈,它将起作用。请参阅此条目。

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

// OK
generic <class T>
ref class D {
   T u;
};
于 2013-04-01T09:03:11.583 回答