我有以下简单类
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
答案 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
错误。