在使用模板模板参数时出现荒谬的错误

时间:2010-11-21 17:33:58

标签: c++ templates template-templates

我一直在尝试创建一个带有2个模板参数的模板化类(Test2),Type1Type2。众所周知,第二个参数也是一个模板化的类,它带有2个模板参数(TypeATypeB)。

现在,为了构造Test2的对象,我希望用户能够使用两种类型的构造函数中的任何一种:

  1. 采用Type1Type2
  2. 的对象
  3. 使用Type1TypeATypeB的对象。
  4. 我写了以下代码:

    #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)

5 个答案:

答案 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";}

};

要获取TypeXTypeY,导出它们非常有用,以便您可以在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是一种模板。您认为TypeXTypeY到底是什么意思?在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

第一个是模板类的实例化,它不接受任何参数。第二个是接受两个参数的模板类模式。