powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / template и приведение типов
14 сообщений из 14, страница 1 из 1
template и приведение типов
    #33992675
Slip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема такая: есть шаблон типа
template<int N> class A{...};
Хочется сделать оператор приведения типа от A<N> к A<M>, но непонятно как.
простейший вариант

template<int N>class A{
...
template<int M> operator A<M>();
...
};
template<int N, int M> A<N>::operator A<M>()
{
...
}

почему-то не работаетю подскажите пожалуйста, как это реализовать.
заранее спасибо за помощь.
...
Рейтинг: 0 / 0
template и приведение типов
    #33992682
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
template <int M, int N>
но типы не через int описываются:
template <class T1, class T2>
...
Рейтинг: 0 / 0
template и приведение типов
    #33992698
Slip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aklintemplate <int M, int N>
но типы не через int описываются:
template <class T1, class T2>

ни фига подобного, аргументом шаблона может быть не только класс, но и, например, число (если не веришь, посмотри на std::bitset - это шаблон типа template<int n>...)
...
Рейтинг: 0 / 0
template и приведение типов
    #33992703
Slip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а если уж совсем точно, то bitset объявлен так:
Код: plaintext
1.
2.
3.
4.
5.
template<size_t N>
class bitset
{
...
};
...
Рейтинг: 0 / 0
template и приведение типов
    #33992707
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Slip Aklintemplate <int M, int N>
но типы не через int описываются:
template <class T1, class T2>

ни фига подобного, аргументом шаблона может быть не только класс, но и, например, число (если не веришь, посмотри на std::bitset - это шаблон типа template<int n>...)

читай еще раз то что я написал:
tamplate <int M, int N> - здесь числа
но приведение - через типы (как вы 1 число приведете к другому?)
tamplate <class T1, class T2>
...
Рейтинг: 0 / 0
template и приведение типов
    #33992710
Slip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aklin Slip Aklintemplate <int M, int N>
но типы не через int описываются:
template <class T1, class T2>

ни фига подобного, аргументом шаблона может быть не только класс, но и, например, число (если не веришь, посмотри на std::bitset - это шаблон типа template<int n>...)

читай еще раз то что я написал:
tamplate <int M, int N> - здесь числа
но приведение - через типы (как вы 1 число приведете к другому?)
tamplate <class T1, class T2>

причем здесь числа?
Код: plaintext
1.
template<int N> class A{...};

A<M> и A<N> -это 2 разных и даже независимых типа, и хочется, чтобы было приведение одного из них к другому.
...
Рейтинг: 0 / 0
template и приведение типов
    #33992718
Slip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
или такое приведение не возможно в принципе?
...
Рейтинг: 0 / 0
template и приведение типов
    #33992719
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
специально перепроверил:
template <int N, int M> - шаблон для ЧИСЕЛ а не для типов.
class1<10,20> class1_1;

template <class N, class M> - шаблон для ТИПОВ.
class1<10,20> class1_1;


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
template <int N, int M>
class cvt
{
public:
	cvt<N,M>(){}
	~cvt<N,M>(){}
	void sss( N &v, M &u )
	{
		u = v;
	}
};

void main()
{
	cvt< 10 ,  11 > c1;
	
	long a =  123 ;
	char c =  1 ;

	c1.sss( c, a );
}

VC--------------------Configuration: tmp - Win32 Debug--------------------
Compiling...
tmp.cpp
D:\f\Code\VC\templates\tmp.cpp(7) : error C2061: syntax error : identifier 'N'
D:\f\Code\VC\templates\tmp.cpp(11) : see reference to class template instantiation 'cvt<N,M>' being compiled
D:\f\Code\VC\templates\tmp.cpp(7) : error C2061: syntax error : identifier 'N'
D:\f\Code\VC\templates\tmp.cpp(15) : see reference to class template instantiation 'cvt<10,11>' being compiled
D:\f\Code\VC\templates\tmp.cpp(20) : error C2660: 'sss' : function does not take 2 parameters
Error executing cl.exe.

tmp.exe - 3 error(s), 0 warning(s)

а это работает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
template <class N, class M>
class cvt
{
public:
	cvt<N,M>(){}
	~cvt<N,M>(){}
	void sss( N &v, M &u )
	{
		u = v;
	}
};

void main()
{
	cvt<char, long> c1;
	
	long a =  123 ;
	char c =  1 ;

	c1.sss( c, a );
}
...
Рейтинг: 0 / 0
template и приведение типов
    #33992724
Slip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aklinспециально перепроверил:
template <int N, int M> - шаблон для ЧИСЕЛ а не для типов.
class1<10,20> class1_1;

template <class N, class M> - шаблон для ТИПОВ.
class1<10,20> class1_1;


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
template <int N, int M>
class cvt
{
public:
	cvt<N,M>(){}
	~cvt<N,M>(){}
	void sss( N &v, M &u )
	{
		u = v;
	}
};

void main()
{
	cvt< 10 ,  11 > c1;
	
	long a =  123 ;
	char c =  1 ;

	c1.sss( c, a );
}

VC--------------------Configuration: tmp - Win32 Debug--------------------
Compiling...
tmp.cpp
D:\f\Code\VC\templates\tmp.cpp(7) : error C2061: syntax error : identifier 'N'
D:\f\Code\VC\templates\tmp.cpp(11) : see reference to class template instantiation 'cvt<N,M>' being compiled
D:\f\Code\VC\templates\tmp.cpp(7) : error C2061: syntax error : identifier 'N'
D:\f\Code\VC\templates\tmp.cpp(15) : see reference to class template instantiation 'cvt<10,11>' being compiled
D:\f\Code\VC\templates\tmp.cpp(20) : error C2660: 'sss' : function does not take 2 parameters
Error executing cl.exe.

tmp.exe - 3 error(s), 0 warning(s)

а это работает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
template <class N, class M>
class cvt
{
public:
	cvt<N,M>(){}
	~cvt<N,M>(){}
	void sss( N &v, M &u )
	{
		u = v;
	}
};

void main()
{
	cvt<char, long> c1;
	
	long a =  123 ;
	char c =  1 ;

	c1.sss( c, a );
}


с этим всем я и не спорю. имелось в виду использование вроде такого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
template<int N>
class A
{
private:
     double array[N];
public:
...
};
...
Рейтинг: 0 / 0
template и приведение типов
    #33992729
Slip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и все таки, вернемся к первому вопросу: почему такой код не работает
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
template<int N> class A
{
...
template<int M> operator A<M>();
...
}

template<int N, int M> A<N>::operator A<M>()
{
...
}


//использование:
...
A< 2 > a;
A< 5 > aa = (A< 5 >)a;
...
...
Рейтинг: 0 / 0
template и приведение типов
    #33992846
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SlipПроблема такая: есть шаблон типа
template<int N> class A{...};
Хочется сделать оператор приведения типа от A<N> к A<M>, но непонятно как.
...
почему-то не работаетю подскажите пожалуйста, как это реализовать.
заранее спасибо за помощь.


Это вообще невозможно. Это несоотносимые типы вообще. Если у них конечно нет общего предка, но и в этом случае это - несоотносимые типы, тогда только к предку можно привести.

Slip
простейший вариант

template<int N>class A{
...
template<int M> operator A<M>();
...
};
template<int N, int M> A<N>::operator A<M>()
{
...
}



Ну мысль правильная, нужно определять оператор приведения к типу. Но можно и конструкторы, присваивания, но вообще кажется что-то это не то все, попахивает плохим дизайном. Хотя однозначно сказать нельзя -- например, почему бы вектор целых чисел не преобразовывать в вектор вещественных -- очень даже логично и правильно.

Если не получится с темплейтной функцией темплейтного класса, и тип, куда надо преобразовывать один и воообще это подойдет, можно попробовать с двумя параметрами шаблона класса - из них один для преобразования.
...
Рейтинг: 0 / 0
template и приведение типов
    #33992891
Slip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проблема в том, что при таком способе описания копмилятор не видит в A этого operator A<M>. наверное, так и должно быть, потому что вообще-то надо писать не template<int N, int M>, a template<int N>template<int M>(так Страуструп говорит), но такой вариант компилятор не понимает и выдает error C2059: syntax error : ''template<''. а вообще-то все это дело должно работать, и в Страуструпе такого типа примерчик есть... в-общем, непонятно.
...
Рейтинг: 0 / 0
template и приведение типов
    #33992892
Slip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivЕсли не получится с темплейтной функцией темплейтного класса, и тип, куда надо преобразовывать один и воообще это подойдет, можно попробовать с двумя параметрами шаблона класса - из них один для преобразования.
а можно поподробнее, и желательно с кодом?
...
Рейтинг: 0 / 0
template и приведение типов
    #33995213
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет, извращенцы! вот и я...
template <int I>
class Templ
{
public:
template <int J> operator Templ<J>&();
};

// только так

template <int I>
template <int J>
Templ<I>::operator Templ<J>&()
{
return reinterpret_cast< Templ<J>& > (*this);
}


void f(Templ<10>& t)
{
;
}

int main()
{
Templ<20> t;
f(t); // g++ 3.2 автоматом не привел, а Intel привел
// если не пролезает придется явно привестись
return 0;
}
ps ответь на китайский вопрос а нахуа? просто ради любви к исскуству
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / template и приведение типов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]