Получение абсурдных ошибок при использовании аргументов шаблона шаблона - PullRequest
1 голос
/ 21 ноября 2010

Я пытался создать шаблонный класс (Test2), который принимает 2 аргумента шаблона, Type1 и Type2.Известно, что вторым аргументом также будет шаблонный класс, который принимает 2 аргумента шаблона (TypeA и TypeB).

Теперь, для создания объекта Test2, я хочу, чтобы пользовательуметь использовать один из двух типов конструкторов:

  1. Тот, который принимает объекты Type1 и Type2.
  2. Тот, который принимает объекты 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');

}

Я много пробовал, но получаю очень абсурдные ошибки, такие как:

wrong number of template arguments (1, should be 2) в строке 17 и20.

Ответы [ 5 ]

6 голосов
/ 21 ноября 2010

Так не работает.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";}
};

Обязательно прочитайте Где поставить «template» и «typename» на зависимых именах , чтобы понять, почему и когда использовать typename перед именами типов, как указано выше.

1 голос
/ 21 ноября 2010

Есть несколько ошибок с этим, но главная ошибка, кажется, в том, что

Test2<int, Test<int, char> >

не так, как вы передаете параметр шаблона шаблона.Это будет передано с использованием

Test2<int, Test>

Это потому, что Test является шаблоном , а Test<int, char> является типом (сгенерированным из этого шаблона.)

0 голосов
/ 21 ноября 2010

Test<int, char> не соответствует template<typename TypeX, typename TypeY> class Type2

Первый - создание шаблона класса, он не принимает никаких параметров. Второй - это шаблон класса шаблона, принимающий два параметра.

0 голосов
/ 21 ноября 2010

Вот один из вариантов:

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

}
0 голосов
/ 21 ноября 2010

Type1 - это тип, Type2 - это шаблон. Что именно вы думаете, TypeX и TypeY определены? Внутри линии template<typename TypeX, typename TypeY> class Type2 > они игнорируются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...