【问题标题】:gcnew operator for generic type泛型类型的 gcnew 运算符
【发布时间】:2013-04-01 08:40:29
【问题描述】:

我有以下简单的类

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

但是编译器抱怨 gcnew T() 不能用于泛型类型 auto 使用的键是错误的函数expects a trailing return type

【问题讨论】:

  • 你为什么将你的成员 m_db 声明为 IDbConnection 却使用 m_db = gcnew T() 将其视为泛型?
  • 谢谢,我以后想做类似"m_db=gcnew SqlConnection()/OracleConnection()/DbOleConnection();"等的事情

标签: c++ c++-cli


【解决方案1】:

感谢您的阅读和回复

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

如上所述,摆脱gcnew 错误。

【讨论】:

  • 内联写代码掉进了成功的坑。 C++/CLI 通常不需要将声明与类的定义分开,头文件被程序集元数据替换。
【解决方案2】:

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

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

【讨论】:

  • 谢谢,但它会导致一个新的错误,指出"indirections on a generic type parameter are not allowed"
猜你喜欢
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
  • 2010-10-16
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多