Re: [VC9] Internal compiler error
От: Chorkov Россия  
Дата: 01.04.10 10:50
Оценка: +1
Здравствуйте, R.O. Prokopiev, Вы писали:


ROP>
ROP>template <template <typename T, T a> class U, U<int, 42> b> struct C;
ROP>



ROP>Код некорректный, Комо его тоже ругает

ROP>Но как исправить не пойму.

Объект не может быть аргументом шаблона.
Можно переделать второй аргумент на указатель на U<int, 42> ?
[VC9] Internal compiler error
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 01.04.10 10:37
Оценка:
template <template <typename T, T a> class U, U<int, 42> b> struct C;


Вроде не баян

Код некорректный, Комо его тоже ругает

"ComeauTest.c", line 1: error: a nontype template parameter may not have class type
template <template <class T, T a> class U, U<int, 42> b> struct C;
^

Но как исправить не пойму.
Re: [VC9] Internal compiler error
От: uzhas Ниоткуда  
Дата: 01.04.10 10:48
Оценка:
У меня такое скомпилировалось
не знаю, это ли вам нужно
template <template <typename T, T a> class U, typename V = U<int, 42> >
struct C
{
};

template <typename A, A a>
class X
{
};

int main()
{
  C<X> x;
  return 0;
}
Re: [VC9] Internal compiler error
От: _nn_  
Дата: 01.04.10 11:33
Оценка:
Здравствуйте, R.O. Prokopiev, Вы писали:

Обычно вместо template template можно использовать более простую технику с одним template.
template<typename T>
struct C
{
  typedef typename T::SpecialType SpecialType;

  C(SpecialType) {}
};

struct Check
{
  typedef U<int, 42> SpecialType;
};

typedef C<Check> CCheck;
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: [VC9] Internal compiler error
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 01.04.10 11:33
Оценка:
Здравствуйте, Chorkov, Вы писали:

C>Здравствуйте, R.O. Prokopiev, Вы писали:



ROP>>
ROP>>template <template <typename T, T a> class U, U<int, 42> b> struct C;
ROP>>



ROP>>Код некорректный, Комо его тоже ругает

ROP>>Но как исправить не пойму.

C>Объект не может быть аргументом шаблона.

C>Можно переделать второй аргумент на указатель на U<int, 42> ?
Точно. Пропустил.
Однако, так тоже падает:
template <template <typename T, T a> class U, U<int, 42> *b> struct C;

(Комо это съел)
Re[2]: Хочу передать в шаблон указатель на специализацию
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 01.04.10 11:51
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, R.O. Prokopiev, Вы писали:


__>Обычно вместо template template можно использовать более простую технику с одним template.

__>
__>template<typename T>
__>struct C
__>{
__>  typedef typename T::SpecialType SpecialType;

__>  C(SpecialType) {}
__>};

__>struct Check
__>{
__>  typedef U<int, 42> SpecialType;
__>};

__>typedef C<Check> CCheck;
__>


Хочу передать в шаблон указатель на экземпляр любой специализации шаблона.
Что то в таком духе:
template <template <typename T, T a> class U *b> struct C{};
A<int, 42> a42;
A<char, 17> a17;
C<&a17> c17;
C<&a42> c42;

Компилер не понимает первую строку. Затрудняюсь.
В крайнем случае проброшу параметры A в C явно, но этого не хотелось бы.
Re[3]: Хочу передать в шаблон указатель на специализацию
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 01.04.10 12:10
Оценка:
Здравствуйте, глубокоуважаемейший R.O. Prokopiev, Вы писали:

ROP>Хочу передать в шаблон указатель на экземпляр любой специализации шаблона.

ROP>Что то в таком духе:
template <template <typename T, T a> class U *b> struct C{};
A<int, 42> a42;
A<char, 17> a17;
C<&a17> c17;
C<&a42> c42;

ROP>Компилер не понимает первую строку. Затрудняюсь.
ROP>В крайнем случае проброшу параметры A в C явно, но этого не хотелось бы.
Вот так тоже не работает:
template <A<typename T, T a> *b> struct C{};
Re[3]: Хочу передать в шаблон указатель на специализацию
От: _nn_  
Дата: 01.04.10 12:42
Оценка:
Здравствуйте, R.O. Prokopiev, Вы писали:

ROP>Хочу передать в шаблон указатель на экземпляр любой специализации шаблона.

ROP>Что то в таком духе:
ROP>
ROP>template <template <typename T, T a> class U *b> struct C{};
ROP>A<int, 42> a42;
ROP>A<char, 17> a17;
ROP>C<&a17> c17;
ROP>C<&a42> c42;
ROP>

ROP>Компилер не понимает первую строку. Затрудняюсь.
ROP>В крайнем случае проброшу параметры A в C явно, но этого не хотелось бы.

Т.е. так:
template<typename T, T a>
struct A { };

template<typename T, T* p>
struct C { };

A<int, 42> a42;
A<char, 17> a17;
typedef C<A<int,42>, &a42> c42;
typedef C<A<char,17>, &a17> c17;


Но чтобы не писать два раза тип ?

В такой постановке не получится, компилятору нужно знать тип указателя.
Можно через базовый класс сделать если он есть или через void*:
template<void* p>
struct C2 { };

typedef C2<&a42> c242;
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Хочу передать в шаблон указатель на специализацию
От: _nn_  
Дата: 01.04.10 12:56
Оценка:
Здравствуйте, R.O. Prokopiev, Вы писали:

ROP>Хочу передать в шаблон указатель на экземпляр любой специализации шаблона.


Кстати, а почему нужно именно через шаблон, неужели через конструктор не подходит ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: Хочу передать в шаблон указатель на специализацию
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 01.04.10 13:03
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, R.O. Prokopiev, Вы писали:


ROP>>Хочу передать в шаблон указатель на экземпляр любой специализации шаблона.


__>Кстати, а почему нужно именно через шаблон, неужели через конструктор не подходит ?

Класс C будет хранить только одно значение типа (int, char и т.д.).
Остальную информацию думаю передавать через тип C.
Re[5]: Хочу передать в шаблон указатель на специализацию
От: _nn_  
Дата: 01.04.10 13:05
Оценка:
Здравствуйте, R.O. Prokopiev, Вы писали:

ROP>Здравствуйте, _nn_, Вы писали:


__>>Здравствуйте, R.O. Prokopiev, Вы писали:


ROP>>>Хочу передать в шаблон указатель на экземпляр любой специализации шаблона.


__>>Кстати, а почему нужно именно через шаблон, неужели через конструктор не подходит ?

ROP>Класс C будет хранить только одно значение типа (int, char и т.д.).
Класс А имелся ввиду ?

ROP>Остальную информацию думаю передавать через тип C.


Не ясна ваша затея.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[6]: Хочу передать в шаблон указатель на специализацию
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 01.04.10 13:21
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, R.O. Prokopiev, Вы писали:


ROP>>Здравствуйте, _nn_, Вы писали:


__>>>Здравствуйте, R.O. Prokopiev, Вы писали:


ROP>>>>Хочу передать в шаблон указатель на экземпляр любой специализации шаблона.


__>>>Кстати, а почему нужно именно через шаблон, неужели через конструктор не подходит ?

ROP>>Класс C будет хранить только одно значение типа (int, char и т.д.).
__>Класс А имелся ввиду ?

ROP>>Остальную информацию думаю передавать через тип C.


__>Не ясна ваша затея.

Поля Галуа реализую.

Класс C содержит одно поле элементарного типа.
Для C переопределены арифметические операции.
Но реализация этих операций зависит от конкретного экземпляра структуры A (таблицы перекодировки и др).
Другими словами:
A — GaloisField
С — FieldElement
В библиотеке Schifra каждый элемент тащит с собой ссылку на поле, нафиг это нужно.
Re[7]: Хочу передать в шаблон указатель на специализацию
От: _nn_  
Дата: 01.04.10 13:39
Оценка:
Здравствуйте, R.O. Prokopiev, Вы писали:

ROP>Здравствуйте, _nn_, Вы писали:


__>>Здравствуйте, R.O. Prokopiev, Вы писали:


ROP>>>Здравствуйте, _nn_, Вы писали:


__>>>>Здравствуйте, R.O. Prokopiev, Вы писали:


ROP>>>>>Хочу передать в шаблон указатель на экземпляр любой специализации шаблона.


__>>>>Кстати, а почему нужно именно через шаблон, неужели через конструктор не подходит ?

ROP>>>Класс C будет хранить только одно значение типа (int, char и т.д.).
__>>Класс А имелся ввиду ?

ROP>>>Остальную информацию думаю передавать через тип C.


__>>Не ясна ваша затея.

ROP>Поля Галуа реализую.

Я в этом увы не силен еще

ROP>Класс C содержит одно поле элементарного типа.

ROP>Для C переопределены арифметические операции.
ROP>Но реализация этих операций зависит от конкретного экземпляра структуры A (таблицы перекодировки и др).

Что значит от конкретного ?

Если следует что нужен экземпляр класса, то его и передать нужно в конструкторе и хранить его (ссылку или как угодно).
Тут же у нас могут быть несколько экземпляров класса.
A a1;
A a2;

C<A> c1(a1);
C<A> c2(a2);


Несмотря на то что тип у c1,c2 один, у них разное поведение.

Если экземпляр всегда один, т.е. паттерн Singleton (одиночка) то тогда не нужно вообще ничего передавать.
struct SingletonA {} // Как-нибудь реализуется

C<SingletonA > c1;


Или же частичная специализация C
template<typename T, T a> struct A {};

template<typename T, T* ptr> struct C;

template<int a, A<int, a>* ptr> struct C<A<int, a>, ptr> {};
template<char a, A<char, a>* ptr> struct C<A<char, a>, ptr> {};

A<int, 1> a;
C<A<int, 1>, &a> c;



ROP>Другими словами:

ROP>A — GaloisField
ROP>С — FieldElement

ROP>В библиотеке Schifra каждый элемент тащит с собой ссылку на поле, нафиг это нужно.

Т.е. само поле вы хотите перетащить из времени выполнения во время компиляции ?
А если во время выполнения хотим создать поле, то как тогда ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[8]: Хочу передать в шаблон указатель на специализацию
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 01.04.10 13:59
Оценка:
Здравствуйте, _nn_, Вы писали:

ROP>>Класс C содержит одно поле элементарного типа.

ROP>>Для C переопределены арифметические операции.
ROP>>Но реализация этих операций зависит от конкретного экземпляра структуры A (таблицы перекодировки и др).


__>Или же частичная специализация C

__>
__>template<typename T, T a> struct A {};

__>template<typename T, T* ptr> struct C;

__>template<int a, A<int, a>* ptr> struct C<A<int, a>, ptr> {};
__>template<char a, A<char, a>* ptr> struct C<A<char, a>, ptr> {};

__>A<int, 1> a;
__>C<A<int, 1>, &a> c;
__>

Я и пришел к подобному варианту.

ROP>>Другими словами:

ROP>>A — GaloisField
ROP>>С — FieldElement

ROP>>В библиотеке Schifra каждый элемент тащит с собой ссылку на поле, нафиг это нужно.

__>Т.е. само поле вы хотите перетащить из времени выполнения во время компиляции ?
Вроде того.
__>А если во время выполнения хотим создать поле, то как тогда ?
Это не понадобится. Преобразование из одного поля в другое (изоморфное ему) я на всякий случай сделаю.
Re[9]: Хочу передать в шаблон указатель на специализацию
От: _nn_  
Дата: 01.04.10 14:12
Оценка:
Здравствуйте, R.O. Prokopiev, Вы писали:

ROP>Я и пришел к подобному варианту.


Тут не ясно для чего нужен класс A.
Не проще ли передать само значение в С и все ?

Да и вообще не ясно зачем городить столько шаблонов

http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[10]: Хочу передать в шаблон указатель на специализацию
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 01.04.10 14:32
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Тут не ясно для чего нужен класс A.

__>Не проще ли передать само значение в С и все ?
__>Да и вообще не ясно зачем городить столько шаблонов
__>
Ну я уже писал. С это элементарное значение (char, short, м.б. int ).
А — это различные таблицы для реализации операций.
Таскать в C что либо кроме значения элемента я считаю накладным.
Re[10]: Хочу передать в шаблон указатель на специализацию
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 01.04.10 17:48
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Тут не ясно для чего нужен класс A.

__>Не проще ли передать само значение в С и все ?
__>Да и вообще не ясно зачем городить столько шаблонов

Кстати, да.
Идея. Класс A можно сделать статическим членом C.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.