Согласованные типы шаблонов

Проблема

Рассмотрим следующий класс

template <typename T>
struct A
{
   T x;
};

Теперь , другой класс имеет такой шаблон:

template <typename T, typename U>
class B
{
   protected:
      std::vector<U> arr;

   public:
      T get_x(unsigned int p) { return arr[p].x; }
};

Я хотел бы получить доступ к полю A :: x изнутри B > :: get_x () и вернуть его без изменений (т. Е. Оставить его тип как T ). Мое плохое знание шаблонов говорит о том, что для этого необходимо знать тип и T , он должен быть одним из параметров шаблона класса B . Однако это позволяет объявить что-то несогласованное, например B > , и в целом звучит как ненужное повторение.

Вопросы

  1. Является ли то, что я написал, примером плохой практики программирования? Как это должно быть написано?
  2. Есть ли возможность вывести тип T из A :: x и избежать двух типов шаблонов? Это похоже на повторение, поэтому я не уверен, есть ли на свете богобоязненное решение, соответствующее стандартам.

Как бы то ни было, я использую GCC 4.6.2 с -std = c ++ 0x.

5
задан fledgling Cxx user 19 November 2011 в 06:29
поделиться