我一直在尝试创建一个带有2个模板参数的模板化类(Test2
),Type1
和Type2
。众所周知,第二个参数也是一个模板化的类,它带有2个模板参数(TypeA
和TypeB
)。
现在,为了构造Test2
的对象,我希望用户能够使用两种类型的构造函数中的任何一种:
Type1
和Type2
。Type1
,TypeA
和TypeB
的对象。 我写了以下代码:
#include <iostream>
template<class TypeA, class TypeB>
struct Test
{
TypeA t1obj;
TypeB t2obj;
Test(const TypeA& t1, const TypeB& t2)
: t1obj(t1), t2obj(t2) {std::cout<<"Test::Type1, Type2\n";}
};
template<class Type1,
template<typename TypeX, typename TypeY> class Type2 >
struct Test2
{
Type1 t1obj;
Type2<typename TypeX, typename TypeY> t2obj; //Line 17
Test2(const Type1& t1,
const Type2<typename TypeX, typename TypeY>& t2) //Line 20
: t1obj(t1), t2obj(t2) { std::cout<<"Test2::Type1, Type2\n";}
Test2(const Type1& t1,
const TypeX& x,
const TypeY& y)
: t1obj(t1), t2obj(x,y) { std::cout<<"Test2::Type1, X, Y\n";}
};
int main()
{
Test<int, char> obj1(1,'a');
Test2<int, Test<int, char> > strangeobj1(10,obj1);
Test2<int, Test<int, char> > strangeobj2(1,2,'b');
}
我已经尝试了很多,但我得到了非常荒谬的错误,如:
第17行和第20行 wrong number of template arguments (1, should be 2)
。
答案 0 :(得分:6)
它不起作用。 Test<int, char>
是一个完整的类型,而不是模板。所以你需要输入参数
template<class Type1,
class Type2 >
struct Test2
{
Type1 t1obj;
Type2 t2obj; //Line 17
Test2(const Type1& t1,
const Type2& t2) //Line 20
: t1obj(t1), t2obj(t2) { std::cout<<"Test2::Type1, Type2\n";}
Test2(const Type1& t1,
const typename Type2::a_type& x,
const typename Type2::b_type& y)
: t1obj(t1), t2obj(x,y) { std::cout<<"Test2::Type1, X, Y\n";}
};
要获取TypeX
和TypeY
,导出它们非常有用,以便您可以在Test2
中使用它们,如上所示。
template<class TypeA, class TypeB>
struct Test
{
typedef TypeA a_type;
typedef TypeB b_type;
// and using them, to show their meaning
a_type t1obj;
b_type t2obj;
Test(const a_type& t1, const b_type& t2)
: t1obj(t1), t2obj(t2) {std::cout<<"Test::Type1, Type2\n";}
};
请务必阅读Where to put the "template" and "typename" on dependent names以了解在上述类型名称之前使用typename
的原因和时间。
答案 1 :(得分:1)
这有几个错误,但主要错误似乎是
Test2<int, Test<int, char> >
不是您传递模板模板参数的方式。这将通过
传递Test2<int, Test>
这是因为Test
是模板,但Test<int, char>
是类型(从该模板生成)。
答案 2 :(得分:0)
Type1
是一种类型,Type2
是一种模板。您认为TypeX
和TypeY
到底是什么意思?在template<typename TypeX, typename TypeY> class Type2 >
行内,它们会被忽略。
答案 3 :(得分:0)
这是一个选项:
#include <iostream>
template<class TypeA, class TypeB>
struct Test
{
TypeA t1obj;
TypeB t2obj;
Test(const TypeA& t1, const TypeB& t2)
: t1obj(t1), t2obj(t2) {std::cout<<"Test::Type1, Type2\n";}
};
template<class Type1, typename TypeX, typename TypeY,
template <typename TypeXi, typename TypeYi> class Type2>
struct Test2
{
Type1 t1obj;
Type2<typename TypeX, typename TypeY> t2obj; //Line 17
Test2(const Type1& t1,
const Type2<typename TypeX, typename TypeY>& t2) //Line 20
: t1obj(t1), t2obj(t2) { std::cout<<"Test2::Type1, Type2\n";}
Test2(const Type1& t1,
const TypeX& x,
const TypeY& y)
: t1obj(t1), t2obj(x,y) { std::cout<<"Test2::Type1, X, Y\n";}
};
int main()
{
Test<int, char> obj1(1,'a');
Test2<int, int, char, Test> strangeobj1(10,obj1);
Test2<int, int, char, Test> strangeobj2(1,2,'b');
}
答案 4 :(得分:0)
Test<int, char>
不匹配template<typename TypeX, typename TypeY> class Type2
第一个是模板类的实例化,它不接受任何参数。第二个是接受两个参数的模板类模式。