我有以下课程
struct Abis
{
void foo() { // does something }
};
struct A
{
typedef Abis bis_type;
bis_type create() { // instanciates Abis object };
};
template<class Tbis> // typically Tbis would be Abis
struct Bbis
{
// something
};
template<class T> // typically T would be A
struct B
{
typedef Bbis<typename T::bis_type> bis_type;
bis_type create() { // instanciates Bbis object };
};
现在我想添加另一个图层:
template<class Tbis, template<class> class Ubis>
struct Cbis : public Ubis<Tbis>
{
void additional_method() { // does something calling Tbis and Ubis methods}
};
并且有一个C类实例化一个Cbis对象,所以我可以编写类似的东西:
C<A,B> c();
Cbis<Abis,Bbis> cbis = c.create();
cbis.additional_method();
这需要能够引用typedef bis_types,所以我尝试了这个
template<class T, template<class> class U>
struct C
{
template<class S>
using Ubis_type = U<S>::bis_type // PROBLEM!
typedef Cbis<typename T::bis_type,Ubis_type> bis_type;
bis_type create();
}
这似乎不起作用,也不起作用
template<class T, template<class> class U>
struct C
{
template<class S>
using Ubis_type = typename U<S>::bis_type // PROBLEM!
typedef Cbis<typename T::bis_type,Ubis_type> bis_type;
bis_type create();
}
作为临时修复,我可以将B类型作为模板参数传递给Cbis,但这并不真正尊重设计,我想了解问题所在。
我的语法是否正确? (我正在使用XCode 7.3)
由于
答案 0 :(得分:0)
主要问题在于您的typedef Bbis bis_type
行 - Bbis
是一个类模板而不是一个类。我认为你的意思很可能是typedef Bbis<T> bis_type
(假设你在这种情况下有T
类型)。在那之后,你的代码基本上可以工作(我必须纠正一些拼写错误才能让它编译),这是最终版本:
(更新:更改了struct C
的定义以适应C<A, B>
所需的用例)
struct Abis
{
void foo() { // does something
}
};
struct A
{
typedef Abis bis_type;
bis_type create() { // instanciates Abis object
return Abis();
}
};
template<class Tbis> // typically Tbis would be Abis
struct Bbis
{
// something
};
template<class T> // typically T would be A
struct B
{
typedef Bbis<T> bis_type;
bis_type create() { // instanciates Bbis object
};
};
template<class Tbis, template<class> class Ubis>
struct Cbis : public Ubis<Tbis>
{
void additional_method() { // does something calling Tbis and Ubis methods
}
};
template<class T, template<class> class U>
struct C
{
template<class S>
using Ubis_type = typename U<S>::bis_type; // PROBLEM!
typedef Cbis<typename U<T>::bis_type,Ubis_type> bis_type;
bis_type create()
{
return bis_type();
}
};
然后你可以像这样使用你的最终struct C
:
int main(int argc, char**args)
{
C<A, B> c;
auto d = c.create();
d.additional_method();
return 0;
}