我该怎么做才能使这项工作成功:
template<class C, class V, Test V::*>
class Test {
};
它给了我编译器错误:
unknown type name 'Test'
目前它是一个自引用模板,这似乎不可能。可以采取什么措施才能使其发挥作用?
EDIT:
这就是我需要这个的目的。我想以最少的编码工作实现双向(认为父子)关系模式。
template <class O, class T, Reference<T, O, Reference O::*> T::* opposite>
class Reference
{
T **data;
int count;
public:
Reference(): data(new T*[N]), count(0) {}
~Reference() {delete[] data;}
Reference &add(T *t) {
handleOtherSide();
return link(t);
}
// a lot of stuff to implement this
};
这就是集合类。下面是它的使用方法:
class Partner
{
public:
Reference<Partner, Address, &Address::partner> addresses;
};
class Address
{
public:
Reference<Address, Partner, &Partner::addresses> partner;
};
我的目标是将 Reference 工作所需的一切都作为模板参数提供,这样就不需要为 Partner 和 Address 等类提供构造函数(目前我提供相反的成员指针作为构造函数参数,但这要求我有参与者类的显式构造函数)。我还需要传入或计算指向 Reference 类的“所有者”指针。我将这个问题留在这里,因为我想重点讨论自引用模板方面。
想到这一点的最简单方法是 boost::bimap。但 bimap 的问题是我不想要封闭的 bimap,而只想要它的左右部分。 bimap 也是不可行的,因为它会导致单个 bimap 管理特定关系的所有关联。它可能会容纳大量对象,从而减慢其操作速度。