当前位置: 首页 > 知识库问答 >
问题:

类内模板函数(容器类型)的声明和容器类型模板类外的定义-

曾德水
2023-03-14

关于我的问题

我有一个模板类,如下所示:

//traits.hpp
 namespace traits {
  typedef std::vector <int>  container_t;
  typedef std::set <int>    container_t2;
  typedef std::list <int>    container_t3;

};

//FOO.hpp
class FOO { 
  public:
    static int a; static int b; static int c; 
 };
 int FOO::a = 10;  int FOO::b = 20;  int FOO::c = 30;


// BAR.hpp
using namespace traits;

template <class FOO>
class BAR {
  public:
   BAR : m_a (FOO::a), m_b (FOO::b), m_c (FOO::c)  {  } 


  // I can happily do this. ===>> VALID
  template <template <typename, typename> class ContainerT, typename ValueT>
  void Initialize(ContainerT <ValueT, std::allocator <ValueT>>&  container) 
  {
    typedef ContainerT<ValueT, std::allocator <ValueT>> type;
    int id = 0;
    for (auto& i : container)
       i = id++;
  }


  void DO_THIS () 
  { 
     Initialize (my_container)
  }

 private:
  container_t  my_container;
   int m_a, m_b, m_c;
}

 // in main.
  BAR <FOO> bar_object;
  bar_object.DO_THIS ();    // calls the initialize function. which is fine.
using namespace traits;

template <class FOO>
class BAR {
  public:
   BAR : m_a (FOO::a), m_b (FOO::b), m_c (FOO::c)  {  } 

  // prototype of Initialize 
  void Initialize ( **?? what to put here ??** ); 
  // I cant put container_t&  BECAUSE  I have several containers such as  
  // set/vector/list. 
  // If I want to initialize the container using set / vector / list, the prototype
  // will be incorrect.
  // i cant declare a prototype for each container type. 

  void DO_THIS () 
  { 
     Initialize (my_container1);
     Initialize (my_container2);
  }

 private:
  container_t1  my_container1;
  container_t2  my_container2
   int m_a, m_b, m_c;
 };


  // unable to define the function properly outside the class. 
  // gives template errors

  template <template <typename, typename> class ContainerT, typename ValueT>
  void Initialize(ContainerT <ValueT, std::allocator <ValueT>>&  container) 
  {
    typedef ContainerT<ValueT, std::allocator <ValueT>> type;
    int id = 0;
    for (auto& i : container)
       i = id++;
  }

所以简而言之,我想要的是:1。在类外部的容器类型上编写泛型函数模板。2.类中函数的原型是什么?

请建议

共有1个答案

姚昊焱
2023-03-14

和前面完全一样,只是省略了正文:

template <class FOO>
class BAR {
  public:
   BAR : m_a (FOO::a), m_b (FOO::b), m_c (FOO::c)  {  } 

  template <template <typename, typename> class ContainerT, typename ValueT>
  void Initialize(ContainerT <ValueT, std::allocator <ValueT>>&  container);

  // ... rest unchanged
};

// Definition outside:

template <class FOO>  // for the class
template <template <typename, typename> class ContainerT, typename ValueT>  // for the function
void BAR<FOO>::Initialize<ContainerT, ValueT>(ContainerT <ValueT, std::allocator <ValueT>>&  container)
{
  // same as before
}
 类似资料:
  • 我需要声明一个可以存储不同类型容器的类。也就是说,如果它能处理STD::Bitset和STD::Array就好了。但是,这两个类需要不同的模板参数······是否可能(以及如何)使用模板化模板类和可变模板来声明此类类? 示例(但错误):

  • 我有一个类模板和一个函数模板定义了一个,它引用要绑定到的模板类型。 我想要的是将< code>make_obj函数声明为< code>friend,这样它可以创建< code>Obj的,但是其他人不能(除了通过copy ctor)。 我尝试了几个朋友声明,包括 和 后者是使< code>make_obj的所有模板实例化成为< code>Obj类的朋友的不太理想的尝试。然而,在这两种情况下,我得到相

  • OpenGL定义了C函数来管理资源。我编写了一个简单的包装器来以RAII的方式处理它们。函数对类似于和。但是,也有一些函数对适用于资源数组,例如和。对于前者,我编写了一个简单的类来完成这项工作,对于后者,我编写了另一个处理数组的类。然而,我注意到有时我只使用一个缓冲区或纹理,在那里我不必承担向量的费用,我想如果发布函数在开始时采用大小参数,我会专门化类析构函数,但是... 对于上述SSCCE g树

  • 考虑以下示例: 而且,如果我们将非类型模板参数的类型改为占位符类型,如下所示: 然后,GCC接受,而Clang拒绝它(两者都拒绝,如上)。 海合会演示,铿锵演示。 (1)GCC HEAD 11.0.0 202 10117和Clang HEAD 12.0.0(20210118),。

  • 我想知道如果函数的模板参数包括但不限于类的模板参数,如何使函数成为类的朋友并在类外定义函数。 例如,我有以下模板类和模板朋友函数: 如果我编译: 我会得到以下链接器错误:

  • 我有一个模板化的C++类,它也有一个模板化的成员函数。这个成员函数的模板参数以特定的方式依赖于类的模板参数(请参阅下面的代码)。我正在为其模板参数的两个不同值实例化(而不是专门化)该类。一切都在这一点上进行。但是,如果我调用模板化的成员函数,对第一个实例化对象的调用只会编译,而不会编译第二个。似乎编译器没有为模板类的第二次实例化实例化模板化成员函数。我正在使用“g++filename.cpp”编译