LINUX.ORG.RU

Не получается особый случай для forward declaration of a template class


0

0

Вот это работает:


class Widget {};

Widget default_widget;

template<Widget& defaults> class ElaboratedWidget;

template<Widget& defaults=default_widget> class ElaboratedWidget: public Widget
{
  //
};

int main()
{
  return 0;
}

А вот это не компилится. Как это правильно написать???


template<ElaboratedWidget& defaults> class ElaboratedWidget;

template<ElaboratedWidget& defaults> class ElaboratedWidget
{
  //
};

int main() 
{
  return 0;
}

Чего вы пытаетесь добиться?...

И что вы имели в виду под этим:

>template<Widget& defaults> class ElaboratedWidget;

?

Sectoid ★★★★★
()
Ответ на: комментарий от dilmah

// ну да, я забыл инстанциацию воткнуть -- вот так понятнее?

class Widget {};

Widget default_widget;

template<Widget& defaults> class ElaboratedWidget;

template<Widget& defaults=default_widget> class ElaboratedWidget: public Widget
{
  //
};

ElaboratedWidget<> ew1;

int main()
{
  return 0;
}

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от Sectoid

/// вот что я понимаю. запусти и увидишь результат.

#include <iostream>

class Widget
{
  public: 
    const char* s;
    Widget(): s("abc\n") {}
};

Widget default_widget;

template<Widget& defaults> class ElaboratedWidget;

template<Widget& defaults=default_widget> class ElaboratedWidget: public Widget
{
  public: const char* s() { return defaults.s; }
};

ElaboratedWidget<> ew1;

int main()
{
  std::cout << ew1.s();
  return 0;
}

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

ну я понял что ты имеешь в виду.

Но как ты себе представляешь это? Есть самый первый ElaboratedWidget, и он обязан быть инстанцирован уже ссылкой на уже имеющийся ElaboratedWidget -- значит он не первый.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

> Но как ты себе представляешь это? Есть самый первый ElaboratedWidget, и он обязан быть инстанцирован уже ссылкой на уже имеющийся ElaboratedWidget -- значит он не первый.

Ну и что? Я могу выделить под него аж 1 килобайт, а после, уже определив класс, инициализировать.

Шаблону нужен *всего лишь ссылка*

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

В смысле, я могу например написать что-то вроде:

char memory[1000];

template <ElaboratedWidget& defaults=(ElaboratedWidget&)memory> class ElaboratedWidget: { ... };

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от Reset

> Внутри template <> пишется тип, а ты херню туда пишешь, естественно не компилится.

Еще один невнимательный. Первый пример компилиться и даже исполняется правильно, а вот второй -- нет.

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от Reset

> Внутри template <> пишется тип, а ты херню туда пишешь, естественно не компилится.

да не. Там не обязательно тип. Там и int может быть, и указатель и ссылка.

Но разные значения генерируют совершенно разные типы, поэтому и не компилируется.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

> но каждая отличная ссылка дает свой уникальный тип. Это разные типы.

и?

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от dilmah

> ElaborateWidget это не тип вообще, как ты ссылку на него делаешь? Это template-id.

Ну так объясни, как сделать на него ссылку. В этом и вопрос. Физический смысл в этом есть, что показывает первый пример.

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

$ cat test0.cxx
template<ElaboratedWidget& defaults> class ElaboratedWidget;

template<ElaboratedWidget& defaults> class ElaboratedWidget
{
  //
};

int main()
{
  return 0;
}
$ g++ test0.cxx
test0.cxx:1: error: ‘ElaboratedWidget’ has not been declared
test0.cxx:3: error: ‘ElaboratedWidget’ is not a type


--- вот, не хочет оно  forward declaration of a template class
 

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

ну может унаследовать любой шаблонный ElaborateWidget от некого базового нешаблонного типа. А аргументом шаблона ElaborateWidget сделать ссылку на этот базовый тип?

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

template < void *place_holder > ElaborateWidget вообще не понятно как будет работать (я пробовал, в шаблоне _нет_ автоматического приведения к типу), а Widget вместо ElaboratedWidget в параметре шаблона работает, но это жуткая кривизна, и мне хочется по-человечески

www_linux_org_ru ★★★★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

В общем, я наверно весь проект перекручу, чтобы избежать этого.

Но на будущее хотелось бы уметь делать.

www_linux_org_ru ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.