Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Анонимные типы в шаблонах классов


Автор: Logo 12.3.2012, 22:00
Пытаюсь сделать шаблон, вызывая его с анонимным типом, но компилятор ругается, не хочет есть код, выдавая соответствующее сообщение.
Код

template <class Type>
class A {
   typedef Type _Type; // наличие или отсуствие не влияет на компиляцию
};

typedef A<struct {int a;}> AA;

Правильно ли я понимаю, что анонимные типы невозможно передавать в шаблоны C++? Странно, зачем такое ограничение, если имя типа используется только внутри класса...

Автор: boostcoder 12.3.2012, 22:37
Цитата(Logo @  12.3.2012,  22:00 Найти цитируемый пост)
транно, зачем такое ограничение, если имя типа используется только внутри класса

так ведь ничто не запрещает декларить типы внутри классов:
Код

struct type {
   struct mymegapuperghypertype { int a; };

   template<typename T>
   void f(const T& t) {}
};


или так:
Код

struct type {
   
   template<typename T>
   void f(const T& t) {}

   void method() {
      struct mymegapuperghypertype { int a; };

      mymegapuperghypertype arg;
      f(arg);
   }
};

Автор: Logo 12.3.2012, 23:02
Так а смысл шаблона тогда? Мне нужно сгенерировать множество классов на основании структур (и параметра unsigned long), а так получается методы нужно в каждом классе заново прописывать.

Автор: boostcoder 13.3.2012, 03:21
Цитата(Logo @  12.3.2012,  23:02 Найти цитируемый пост)
Так а смысл шаблона тогда?

вот шаблон с шаблонной структурой:
Код

#include <iostream>

struct type {
   
   template<typename T>
   void f(const T& t) {
      struct mymegapuperghypertype { T a; };
      mymegapuperghypertype arg = {t};
      std::cout << arg.a << std::endl;
   }

   void method() {
      f(3);
      f(3.14);
   }
};

int main() {
   type t;
   t.method();
}


http://liveworkspace.org/code/1b8b4f673dc00e9185b53bebb2dbfbe5


или объясняй задачу шире.

Автор: Logo 13.3.2012, 04:32
Ну, нужно создать класс(много классов) на основе структур, и параметра unsigned long. Этому классу должны быть доступны методы из либо родительского класса, либо шаблона.
Получается самое красивое решение, которое выходит, создать не анонимную структуру, с именем, аналогичным имени класса, начиная с подчеркивания:
Код

_ClassName struct {
  int one;
  int two;
  int three;
}
typedef BaseClass<_ClassName, 10> ClassName
//И т.д., для каждой структуры и числа свой класс

//Базовый шаблон
template <class T, unsigned long size>
class {
  //Методы здесь
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)