从嵌套的STL模板中推断类型

时间:2011-12-08 20:09:04

标签: c++ templates stl

如何在不明确引用参数的情况下让我的类推断参数的内部类型?请看下面的最小例子:

#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 个答案:

答案 0 :(得分:3)

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);