2013-04-01 8 views
0

Я следующий простой классgcnew оператор универсального типа

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() не может быть использована для универсального типа < 2>auto ключ используется неправильно как функция expects a trailing return type

+0

Почему вы объявляете свой член 'm_db' как' IDbConnection' и все же рассматриваете его как общий, используя 'm_db = gcnew T()'? –

+0

Спасибо, я хотел бы потом сделать что-то вроде этого '' m_db = gcnew SqlConnection()/OracleConnection()/DbOleConnection(); "и т. Д. –

ответ

1

для переменного тока hieve типичность, вы должны изменить свое определение класса в

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

должен работать, как вы хотели.

EDIT

Кажется, вы не можете объявить ссылку на общий. Если вы назначаете объект в стек, он будет работать. См. 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; 
}; 
+0

Спасибо, но это приводит к появлению новой ошибки, в которой указаны" "ссылки на общий тип параметра не разрешены »' –

0

Благодарим Вас за чтение и ответы

Я забыл это where T:IDbConnection, gcnew() которая точно так же, как C# дженериков

, чтобы избавиться от ошибки gcnew, как указано выше.

+0

'Не могу проголосовать за собственный ответ за 2 дня' :-D –

+0

Падение успеха в силе, написав встроенный код. C++/CLI часто не требует выделения объявления из определения класса, файлы заголовков заменяются метаданными сборки. –

Смежные вопросы