Конструкторы в шаблонах
От: chukichuki  
Дата: 22.10.04 05:41
Оценка:
В чем разница :

template <typename A>
class TMP1
{
...
TMP1() { ... } /* Вариант 1. */
...
};

и

template <typename A>
class TMP2
{
...
TMP2<A>() { ... } /* Вариант 2. Зачем введена такая запись конструктора? Как она может использоваться в отличном от первого варианта контексте */
...
};

Такая запись работает при компиляции Borland C++ и g++ ( на других не проверял )
Re: Конструкторы в шаблонах
От: Андрей Россия  
Дата: 22.10.04 05:45
Оценка:
Здравствуйте, chukichuki, Вы писали:

skip

Ничем не отличается, вариант 2 избыточен, но допустим
Re[2]: Конструкторы в шаблонах
От: chukichuki  
Дата: 22.10.04 06:16
Оценка:
Здравствуйте, Андрей, Вы писали:

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

А>Ничем не отличается, вариант 2 избыточен, но допустим

Тогда зачем такой вариант введен в язык ?
Re[3]: Конструкторы в шаблонах
От: Андрей Россия  
Дата: 22.10.04 06:17
Оценка:
Здравствуйте, chukichuki, Вы писали:

C>Здравствуйте, Андрей, Вы писали:


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

А>>Ничем не отличается, вариант 2 избыточен, но допустим

C>Тогда зачем такой вариант введен в язык ?


Это лучше у Бьярна Страуструпа спросить
Re[2]: Конструкторы в шаблонах
От: Lorenzo_LAMAS  
Дата: 22.10.04 06:56
Оценка:
А>Ничем не отличается, вариант 2 избыточен, но допустим

Интересно только, что вне класса таким образом конструктор определить не получится
Of course, the code must be complete enough to compile and link.
Re[3]: Конструкторы в шаблонах
От: Андрей Россия  
Дата: 22.10.04 08:33
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

А>>Ничем не отличается, вариант 2 избыточен, но допустим


L_L>Интересно только, что вне класса таким образом конструктор определить не получится


Ну так это без базаров. Вопрос-то был про инлайновые методы, насколько я понял из кода.
Re[4]: Конструкторы в шаблонах
От: Lorenzo_LAMAS  
Дата: 22.10.04 08:55
Оценка:
А>Ну так это без базаров. Вопрос-то был про инлайновые методы, насколько я понял из кода.

Просто у того же Бьярна Страуструпа в TCPL SE есть такое:

... If you prefer, you can be explicit:

template<class C> String<C>::String<C>()
{
      p = new Srep(0, C());
}

Of course, the code must be complete enough to compile and link.
Re[5]: Конструкторы в шаблонах
От: Андрей Россия  
Дата: 22.10.04 09:15
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

skip

ну, если не лень писать, то почему бы и нет?
с другой стороны, лично я шаблоны далеко не каждый день пишу и было время, когда я путался, где надо <C> писать, а где не надо
а в таком варианте думать не надо
Re[6]: Конструкторы в шаблонах
От: Lorenzo_LAMAS  
Дата: 22.10.04 09:18
Оценка:
А>а в таком варианте думать не надо

Я к чему все это завел — вариант из Страуструпа не компилится.
Of course, the code must be complete enough to compile and link.
Re[7]: Конструкторы в шаблонах
От: Андрей Россия  
Дата: 22.10.04 09:20
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

А>>а в таком варианте думать не надо


L_L>Я к чему все это завел — вариант из Страуструпа не компилится.


Я тоже так думал, но VC7.1 съел вот это за милую душу

template<class A>
class CTest
{
public:
  CTest();
};


template<class A>
CTest<A>::CTest<A>()
{
}


int main()
{
  CTest<int> aa;

  return 0;
}


или я чего-то не так понял?
Re[8]: Конструкторы в шаблонах
От: Lorenzo_LAMAS  
Дата: 22.10.04 09:27
Оценка:
А>Я тоже так думал, но VC7.1 ....

А я и сейчас так думаю, вот диагностика того, что имею под рукой

template<class>
class A
{
public:
   A();
};

template<class T>
A<T>::A<T>()
{
}


icc 7.1

c.C(11): error: overloaded function "A<<unnamed>>::A" is not a template
A<T>::A<T>()
^

compilation aborted for c.C (code 2)


g++ 3.2.3

c.C:12: `A<T>' specified as declarator-id
c.C:12: no `int A<<anonymous template type parameter> >::A<T>()' member
function declared in class `A<<anonymous template type parameter> >'
c.C:12: template definition of non-template `int A<<anonymous template type
parameter> >::A<T>()'


Comeau online

"ComeauTest.c", line 11: error: overloaded function "A<<unnamed>>::A" is not a
template
A<T>::A<T>()
^

1 error detected in the compilation of "ComeauTest.c".

Of course, the code must be complete enough to compile and link.
Re[9]: Конструкторы в шаблонах
От: Bell Россия  
Дата: 22.10.04 09:32
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

А>>Я тоже так думал, но VC7.1 ....


L_L>А я и сейчас так думаю, вот диагностика того, что имею под рукой


L_L>
L_L>template<class>
L_L>class A
L_L>{
L_L>public:
L_L>   A();
L_L>};

L_L>template<class T>
L_L>A<T>::A<T>()
L_L>{
L_L>}
L_L>


Быть может имелось ввиду

template <class T>
class A
...

?
Любите книгу — источник знаний (с) М.Горький
Re[10]: Конструкторы в шаблонах
От: Lorenzo_LAMAS  
Дата: 22.10.04 09:34
Оценка: 1 (1)
B>Быть может имелось ввиду

Так ведь можно это Т опустить, я и не стал его писать. Оно к делу не относится.
Of course, the code must be complete enough to compile and link.
Re[9]: Конструкторы в шаблонах
От: Андрей Россия  
Дата: 22.10.04 09:35
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

skip

template<class>
class CTest
{
public:
  CTest();
};

template<class A>
CTest<A>::CTest<A>()
{
}

int main()
{
  CTest<int> aa;

  return 0;
}


что-то здесь не то. я знаю, что этот код компиляться не должен.
но VC7.1 и IC8.0 кушают его даже без ворнингов
причем, точно в том виде, в котором ты написал, то есть template<class>
Re[10]: Конструкторы в шаблонах
От: Lorenzo_LAMAS  
Дата: 22.10.04 09:39
Оценка:
А>причем, точно в том виде, в котором ты написал, то есть template<class>

как раз это делу не помеха, так писать можно. А вот A<T>::A<T> — интел компилит, видимо, из-за совместимости с VC ?
Of course, the code must be complete enough to compile and link.
Re[11]: Конструкторы в шаблонах
От: Bell Россия  
Дата: 22.10.04 09:53
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

B>>Быть может имелось ввиду


L_L>Так ведь можно это Т опустить, я и не стал его писать. Оно к делу не относится.


Ух ты, а я и не знал
А где написано?
Любите книгу — источник знаний (с) М.Горький
Re[12]: Конструкторы в шаблонах
От: Lorenzo_LAMAS  
Дата: 22.10.04 10:00
Оценка:
B>А где написано?

позор мне, точной ссылки из стандарта не найду. было у Александреску и Вандевурда.
Of course, the code must be complete enough to compile and link.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.