Шаблонные методы в шаблонном классе - PullRequest
1 голос
/ 07 марта 2012

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

CTest<T>

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

CTest<U>

с T, не обязательно равным 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;
}

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

1 Ответ

2 голосов
/ 07 марта 2012

Кажется, ваша основная проблема - это конструктор и деструктор в определении класса: они должны использовать дополнительную квалификацию.Удаление этого барахла приводит к тому, что код компилируется для меня со всеми имеющимися у меня компиляторами (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;
}
...