|
|
|
template и приведение типов
|
|||
|---|---|---|---|
|
#18+
Проблема такая: есть шаблон типа 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>() { ... } почему-то не работаетю подскажите пожалуйста, как это реализовать. заранее спасибо за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2006, 18:04 |
|
||
|
template и приведение типов
|
|||
|---|---|---|---|
|
#18+
template <int M, int N> но типы не через int описываются: template <class T1, class T2> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2006, 18:13 |
|
||
|
template и приведение типов
|
|||
|---|---|---|---|
|
#18+
Aklintemplate <int M, int N> но типы не через int описываются: template <class T1, class T2> ни фига подобного, аргументом шаблона может быть не только класс, но и, например, число (если не веришь, посмотри на std::bitset - это шаблон типа template<int n>...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2006, 18:33 |
|
||
|
template и приведение типов
|
|||
|---|---|---|---|
|
#18+
а если уж совсем точно, то bitset объявлен так: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2006, 18:37 |
|
||
|
template и приведение типов
|
|||
|---|---|---|---|
|
#18+
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> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2006, 18:40 |
|
||
|
template и приведение типов
|
|||
|---|---|---|---|
|
#18+
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. A<M> и A<N> -это 2 разных и даже независимых типа, и хочется, чтобы было приведение одного из них к другому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2006, 18:44 |
|
||
|
template и приведение типов
|
|||
|---|---|---|---|
|
#18+
или такое приведение не возможно в принципе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2006, 18:53 |
|
||
|
template и приведение типов
|
|||
|---|---|---|---|
|
#18+
специально перепроверил: 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. 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2006, 18:54 |
|
||
|
template и приведение типов
|
|||
|---|---|---|---|
|
#18+
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. 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. с этим всем я и не спорю. имелось в виду использование вроде такого: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2006, 18:57 |
|
||
|
template и приведение типов
|
|||
|---|---|---|---|
|
#18+
и все таки, вернемся к первому вопросу: почему такой код не работает Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2006, 19:07 |
|
||
|
template и приведение типов
|
|||
|---|---|---|---|
|
#18+
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>() { ... } Ну мысль правильная, нужно определять оператор приведения к типу. Но можно и конструкторы, присваивания, но вообще кажется что-то это не то все, попахивает плохим дизайном. Хотя однозначно сказать нельзя -- например, почему бы вектор целых чисел не преобразовывать в вектор вещественных -- очень даже логично и правильно. Если не получится с темплейтной функцией темплейтного класса, и тип, куда надо преобразовывать один и воообще это подойдет, можно попробовать с двумя параметрами шаблона класса - из них один для преобразования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2006, 23:14 |
|
||
|
template и приведение типов
|
|||
|---|---|---|---|
|
#18+
проблема в том, что при таком способе описания копмилятор не видит в A этого operator A<M>. наверное, так и должно быть, потому что вообще-то надо писать не template<int N, int M>, a template<int N>template<int M>(так Страуструп говорит), но такой вариант компилятор не понимает и выдает error C2059: syntax error : ''template<''. а вообще-то все это дело должно работать, и в Страуструпе такого типа примерчик есть... в-общем, непонятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2006, 01:26 |
|
||
|
template и приведение типов
|
|||
|---|---|---|---|
|
#18+
MasterZivЕсли не получится с темплейтной функцией темплейтного класса, и тип, куда надо преобразовывать один и воообще это подойдет, можно попробовать с двумя параметрами шаблона класса - из них один для преобразования. а можно поподробнее, и желательно с кодом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2006, 01:28 |
|
||
|
template и приведение типов
|
|||
|---|---|---|---|
|
#18+
Привет, извращенцы! вот и я... 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 ответь на китайский вопрос а нахуа? просто ради любви к исскуству ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2006, 20:21 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33995213&tid=2030486]: |
0ms |
get settings: |
11ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
154ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
| others: | 246ms |
| total: | 515ms |

| 0 / 0 |
