关于我的问题
我有一个模板类,如下所示:
//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.类中函数的原型是什么?
请建议
和前面完全一样,只是省略了正文:
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”编译