шаблонный метод переопределяет не шаблонный метод - PullRequest
2 голосов
/ 28 марта 2011

Я хочу поместить любой объект (объект, объект и т. Д.) В один shared_ptr.Поэтому я создал базовый класс и использую shared_ptr.

Но как я могу объявить

T getMember();

в базовом классе, чтобы я мог вызывать ObjectBase.getMember?

class ObjectBase
{
public:
  //virtual getMember HOWTO?
};

template<typename T>
class Object : public ObjectBase
{
public:
  Object(T x):member(x) { }
  T getMember() { return member; }

private:
  T member;
};

Ответы [ 2 ]

3 голосов
/ 28 марта 2011

Вы не можете. Как должно выглядеть такое объявление, чтобы оно могло возвращать все виды типов? Это просто невозможно. Вам придется привести ObjectBase* к правильному Object<T>*, а затем использовать функцию getMember. Это возможно, только если все T имеют общий базовый класс, поэтому вы можете вернуть указатель на него. Но это наложит строгое ограничение на T.

0 голосов
/ 28 марта 2011

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

В большинствеВ некоторых случаях хранение совершенно не связанных между собой объектов в одном и том же контейнере не является хорошим вариантом проектирования, но в тех немногих случаях, когда это действительно так, вы можете использовать типы вариантов (рассмотрите boost :: any или boost :: option, в зависимости от ваших реальных требований.Это связанная, протестированная реализация типа варианта, который вы могли бы использовать напрямую.

...