C ++ Многоуровневые конструкторы шаблонов классов не компилируются - PullRequest
0 голосов
/ 24 февраля 2019

Следующие многоуровневые шаблоны классов не компилируются:

#include <iostream>
using namespace std;

template<typename T>
class A {
private:
  A(void);
  T _num_;
public:
  A(T num): _num_(num){};
  void printNum(void){

    cout << _num_ << "\n";

  }
};

template<typename T>
class B : public A<T> {
private:
  B(void);
public:
  B(T num): A(num){};
};

class C : public B<int> {
private:
  C(void);
public:
  C(int num): B(num){};
};

int main()
{
  /* code */
  auto c = C(2);

  c.printNum();
  return 0;
}

ошибка: инициализатор члена 'A' не называет элемент не статических данных или базовый класс B (T num): A (num) {};

ошибка: инициализатор элемента 'B' не называет элемент нестатических данных или базовый класс C (int num): B (num) {};

Однако удаление шаблонов выполняется без проблем.

#include <iostream>
using namespace std;

class A {
private:
  A(void);
  int _num_;
public:
  A(int num): _num_(num){};
  void printNum(void){

    cout << _num_ << "\n";

  }
};

class B : public A {
private:
  B(void);
public:
  B(int num): A(num){};
};

class C : public B {
private:
  C(void);
public:
  C(int num): B(num){};
};

int main()
{
  /* code */
  auto c = C(2);

  c.printNum();
  return 0;
}

1 Ответ

0 голосов
/ 24 февраля 2019

Эта проблема была синтаксической ошибкой.Типовое имя T должно быть передано вызовам базового ctor в определении ctor производного класса в дополнение к объявлению наследования класса.

class B : public A<T> {//...
B(T num): A<T>(num){}; //NOTE: <T> added to A ctor call.

и

class C : public B<int> {//...
C(int num): B<int>(num){};  //NOTE: <int> added to B ctor call.

Полный код компиляции:

#include <iostream>
using namespace std;

template<typename T>
class A {
private:
  A(void);
  T _num_;
public:
  A(T num): _num_(num){};
  void printNum(void){

    cout << _num_ << "\n";

  }
};

template<typename T>
class B : public A<T> {
private:
  B(void);
public:
  B(T num): A<T>(num){};
};

class C : public B<int> {
private:
  C(void);
public:
  C(int num): B<int>(num){};
};

int main()
{
  /* code */
  auto c = C(2);

  c.printNum();
  return 0;
}
...