【问题标题】:writing templated member function over container type outside a template class在模板类之外的容器类型上编写模板化成员函数
【发布时间】:2014-03-19 03:52:34
【问题描述】:

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

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 等等。

但是我得到编译器错误

" Initialize (T&) 的原型与 Foo 类中的任何一个都不匹配" " 候选人正在初始化 (container_t&) " ...

【问题讨论】:

  • 您的意思是让您的traits 类成为模板吗?正如目前所写的那样,这个问题没有任何意义。为什么Foo 需要成为类模板?
  • @Praetorian:除了Initialize 的定义中的错误之外,它确实(至少一些 有意义)。无论模板参数的拼写方式与后来用作参数的类型完全相同,Foo 模板都可以接受任何类型,而不仅仅是traits
  • @David 同意,但意图似乎只是将 traits 作为模板参数,因为 OP 希望它具有 container_t 嵌套类型。但话又说回来,也许他定义了多个 traits 类型类。
  • @Praetorian 特征类包含很多类型定义(本质上它是一个具有类型定义和静态成员的类。有许多类,例如 Foo 依赖于特征类。它包含容器的类型定义类型,以便我可以从向量更改为集合等等(当然,某些实现会更改以填充向量或集合(push_back 或 insert),但现在还可以

标签: c++ templates c++11


【解决方案1】:

这能解决您的问题吗?

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

【讨论】:

  • 是的,它确实解决了问题。但是我想在定义中避免( typename traits::container_t& )。我想没有别的办法了。如果我在类中编写整个函数,那么不会有任何问题。但是有太多这样的模板函数不会使类易于阅读。感谢您的解决方案和建议!
【解决方案2】:
template <typename T> 
//        vvvvvv   ^^                    mismatch!!!
void Foo <traits>::Initialize (T& data)  
{ 
   fill the data 
}

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

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

【讨论】:

    猜你喜欢
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多