在类内部声明模板化函数(基于容器类型),在模板类外部定义模板化函数(基于容器类型)
declaration of templated function (over container type) inside class and definition of it outside a template class over container type-
关于我这里的问题
我有一个模板类如下://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.
我只是想这样做:在类之外定义Initialize模板函数。
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++;
}
我可以在类内部编写函数模板Initialize()而不会出现任何错误。但我想把它写在外面。对我之前帖子的评论很有帮助,但我不得不改变我的实现
总之我想要的是:1. 在类之外的容器类型上编写泛型函数模板。2. 这个函数在类中的原型是什么?
请建议
与之前完全相同,只是省略了正文:
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
}
相关文章:
- 检查函数返回类型是否与STL容器类型值相同
- 如何泛化作用于不同类型的向量的函数?
- 如何实现一个接受任何容器类型的函数
- 将 Eigen::MatrixXd 矩阵转换为 cgal 容器类型
- 如何根据用户输入确定容器类型
- 依赖于依赖类型的非静态数据成员的非限定名称
- 是否有其他容器类型的String_view等效
- 为什么静态大小数组类型不能是容器类型
- 如何使用类型专用化模板方法,该类型本身就是一个模板,其中只有返回类型依赖于模板类型
- 覆盖运算符<<适用于所有类型
- "size_t"是否始终是"vector<int>::size_type"或任何其他容器类型的别名?
- 为什么我们没有适用于所有类型的偏移量(具有虚拟继承的类型除外)?
- 定义用于迭代不同容器类型的泛型转换迭代器
- 类模板:为什么我不能将单一方法专用于空类型?
- 是否可以在可变参数模板中推断出容器类型
- 对标准库容器类型进行排序的static_assert() 的优雅方式
- boost::spirit解析器和boost::fusion支持哪些容器类型
- C++ 将函数应用于容器中的某些元素
- 一个奇怪的C++错误,也许是相对于长长类型而言的
- C++开关只适用于积分类型的基本原理是什么