2012-03-07 3 views
0

Я хотел бы определить шаблонный классшаблонные методы в шаблонном классе

CTest<T> 

, в котором один из методов может возвращать объект типа

CTest<U> 

с Т не обязательно равен U следующим образом:

template<typename T> 
class CTest { 
    // Properties 
    private: 
    T Prop_1; 
    // Methods 
    public: 
    CTest::CTest (T); 
    CTest::~CTest(); 
    template<typename U> 
    CTest<U> Method_1 (U); 
}; 
template<typename T> 
CTest<T>::CTest (T _Prop_1) { 
    this->Prop_1 = _Prop_1; 
} 
template<typename T> 
CTest<T>::~CTest() { 
} 
template<typename T, typename U> 
CTest<U> CTest<T>::Method_1 (U _P) { 
    CTest<U> Result (_P); 
    return Result; 
} 

на самом деле, я также попытался определения method_1 следующим образом:

template<typename T> 
template<typename U> 
CTest<U> CTest<T>::Method_1 (U _P) { 
    return CTest<U> (_P); 
} 

Я пытался потреблять класс следующим образом:

int main() { 
    CTest<int> Test (1); 
    auto Test_2 = Test.Method_1<float> (2.0); 
    return 0; 
} 

Но я получаю ошибку во время компиляции «не в состоянии соответствовать функции к существующей декларации.» Заранее спасибо за вашу помощь.

+0

Ваша вторая попытка ('шаблон шаблон ') это хорошо, но у вас есть ошибка синтаксиса в самом классе - 'CTest :: CTest()' является недействительным и должен просто «CTest()» и «dtor». Также зарезервированы идентификаторы, начинающиеся с подчеркивания, за которыми следуют заглавные буквы, и вы не можете их использовать. –

+0

Некоторые из идентификаторов, которые вы используете, зарезервированы, в частности, все идентификаторы, начинающиеся с символа подчеркивания (_), за которым следует буква верхнего регистра. –

+0

Не знал этого. Большое спасибо, внесут изменения. – Shredderroy

ответ

1

Кажется, ваша основная проблема - это конструктор и деструктор в определении класса: они должны использовать дополнительную квалификацию. Удаление этого мусора вызывает компилятор кода для меня со всеми компиляторами (gcc, clang и EDG, для последнего мне нужно было удалить auto Test 2 =). Вот точный код я составил:

template<typename T> 
class CTest { 
private: 
    T Prop_1; 
public: 
    CTest (T); 
    ~CTest(); 
    template<typename U> CTest<U> Method_1 (U); 
}; 
template<typename T> 
CTest<T>::CTest (T _Prop_1) { 
    this->Prop_1 = _Prop_1; 
} 
template<typename T> 
CTest<T>::~CTest() { 
} 

template<typename T> 
template<typename U> 
CTest<U> CTest<T>::Method_1 (U _P) { 
    return CTest<U> (_P); 
} 

int main() { 
    CTest<int> Test (1); 
    auto Test_2 = Test.Method_1<float> (2.0); 
    return 0; 
} 
+0

Спасибо за компиляцию и тестирование. – Shredderroy

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