Тип вывода из вложенного шаблона STL - PullRequest
0 голосов
/ 09 декабря 2011

Как мне заставить мой класс вывести внутренний тип параметра без явной ссылки на него?Посмотрите на минимальный пример ниже:

#include <vector>

template <class T> 
class foo {
public:
  foo(std::vector<T> &x) :
    _x(x) {
      T dummy = x.front(); // Trying to trick the compiler here
   }
private:
  std::vector<T> _x;
};

int main() {
  std::vector<int> a;
  foo<int> b(a);  // This works
  foo c(a);       // This fails
  return 0;
}

Я вижу, что foo ожидает, что его аргумент будет vector<int>, но он позволяет мне создать объект типа T==[int], так что кажетсячто это за внутренний тип!Не обращая внимания на тот факт, что присвоение dummy завершается неудачно, когда a пусто ... как я могу сослаться на вложенный внутренний тип?

1 Ответ

3 голосов
/ 09 декабря 2011
foo c(a);       // This fails

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

В C ++ 11 вы можете сделать это:

template<class T>
foo<T> make_foo(std::vector<T> const& x){
  return foo<T>(x);
}

// in main
auto f = make_foo(a);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...