在模板类之外的容器类型上编写模板化成员函数

时间:2014-03-19 03:52:34

标签: c++ templates c++11

我有一个模板类,我试图在类定义之外定义一个成员函数,如下所示:

class traits {
  typedef std::vector<int> container_t;
  ...other typedefs// 

};

template <class traits>
class Foo {
  typedef typename traits::container_t  container_t  
  // where container_t = std::vector <int>

  // member function to be templatized over container type
  void Initialize (container_t&);

private:
  container_t  temp;   //temp is of type std::vector<int>

};


template <typename T> 
void Foo <traits>::Initialize (T& data)  
{ 
   fill the data 
}

我希望函数Initialize采用模板容器类型 - container_t其中container_t可以是std :: vector或std :: set等等。

但我收到编译错误

&#34; Initialize(T&amp;)的原型与Foo&#34;中的任何一个都不匹配。 &#34;候选人是Initialize(container_t&amp;)&#34; ......

2 个答案:

答案 0 :(得分:1)

这会解决您的问题吗?

template <class traits>
void Foo<traits>::Initialize( typename traits::container_t& t ) {
  // code
}

答案 1 :(得分:1)

template <typename T> 
//        vvvvvv   ^^                    mismatch!!!
void Foo <traits>::Initialize (T& data)  
{ 
   fill the data 
}

模板参数和传递给类模板的参数不一样。你需要解决这个问题。此外,我建议您不要将模板参数命名为与稍后将在该位置使用的类型相同的名称和拼写,因为这通常会引起混淆。你可以改变大写:

class traits { … };
template <typename Traits>
class Foo { … };