Наследование от не шаблонного класса, который имеет шаблонный конструктор - как устранить неоднозначность? - PullRequest
2 голосов
/ 08 января 2009

Допустим, у нас есть класс, MyParent:

class MyParent
{
public:
  template<namespace T>
  MyParent()
  {
    T* Something;
  }
};

И производный класс, который использует этот конструктор:

class MyDerived : public MyParent
{
public:
  MyDerived()
  : MyParent<int>()
  {
  }
};

Тогда я получаю ошибку компиляции, потому что есть двусмысленность. Компилятор считает, что int является аргументом шаблона для класса, а не для конструктора.

Как мне указать, что я хочу, чтобы int был аргументом для конструктора?

Ответы [ 2 ]

4 голосов
/ 08 января 2009

Обратите внимание, что ваш вопрос не относится к наследованию. Учитывая ваш пример кода, вы не можете создать экземпляр MyParent вообще, либо потому, что он не принимает список аргументов шаблона, либо потому, что у него нет конструктора по умолчанию.

Чтобы создать экземпляр MyParent с шаблоном конструктора, вам нужно предоставить компилятору какой-то способ узнать аргумент шаблона, а вы не можете сделать это с помощью конструктора без аргументов. Вам нужно дать конструктору MyParent параметр. Вот пример, основанный на коде от Alf P. Steinbach :

template <typename T>
struct UseMethodsOf {};

class MyParent
{
public:
  template <typename T>
  MyParent(UseMethodsOf<T>)
  {
    T* Something;
  }
};

class MyDerived: public MyParent
{
public:
  MyDerived()
  : MyParent(UseMethodsOf<int>())
  {
  }
};
4 голосов
/ 08 января 2009

Это невозможно. Из стандартного раздела 14.8.1 Явный аргумент шаблона он отмечает:

[Примечание: поскольку явный список аргументов шаблона следует за именем шаблона функции, а также потому, что шаблоны функций-членов преобразования и шаблоны функций-членов конструктора вызываются без использования имя функции, нет способа предоставить явный список аргументов шаблона для этих шаблонов функций. ]

Как отмечено в комментариях, вам нужно, чтобы конструктор принял параметр типа T (или const T &), а затем имел MyDerived call MyParent::MyParent с параметром типа int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...