Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с шаблонами при компиляции

842
18 января 2010 года
sigmov
301 / / 16.09.2008
Проблема при компиляции кода:

Есть такой код в котором все ОК
Код:
namespace My
{
    template<typename T> struct A sealed; \\объявляем что класс A<T> существует
    template<typename T> struct B sealed; \\объявляем что класс B<T> существует

    template<typename T> struct A sealed
    {
        B<T> func() { return B<T>(); }
    };
    template<typename T> struct B sealed
    {
        A<T> func() { return A<T>(); }
    };
}

int _tmain(int argc, _TCHAR* argv[])
{
    My::A<int> a;
    a.func();
    return 0;
}


А вот такой код уже выдает ошибку: use of undefined type 'My::B<T>'
Код:
namespace My
{
    template<typename T> struct A sealed;
    template<typename T> struct B sealed;

    template<typename T> struct A sealed
    {
        B<bool> func() { return B<bool>(); }
    };
    template<typename T> struct B sealed
    {
        A<bool> func() { return A<bool>(); }
    };
}

int _tmain(int argc, _TCHAR* argv[])
{
    My::A<int> a;
    a.func();
    return 0;
}


Т.е. просто напросто компилятор еще не знает о существовании класса B<bool>
В принципе конечно можно вынести реализацию методов после инициализации обоих шаблонов, но не хотелось бы из эстетических соображений.

Что можете посоветовать?
87
18 января 2010 года
Kogrom
2.7K / / 02.02.2008
Не могу найти отличий в приведённых кодах. В чём оно?
307
18 января 2010 года
Artem_3A
863 / / 11.04.2008
да, и я различий не вижу! мне кажется или вы по ошибки запостили один код дважды? ;)
842
19 января 2010 года
sigmov
301 / / 16.09.2008
Прошу прощения.... 2й раз не то скопировал

Исправил.
87
19 января 2010 года
Kogrom
2.7K / / 02.02.2008
Подозреваю, что придётся делать частичную специализацию шаблона. Как-то так:

Код:
namespace My
{
    template<typename T> struct A;
    template<typename T> struct B;

    template<> struct A<bool>{ /* ... */ };
    template<> struct B<bool>{ /* ... */ };

    template<typename T> struct A
    {
        B<bool> func() { return B<bool>(); }
    };
    template<typename T> struct B
    {
        A<bool> func() { return A<bool>(); }
    };
}

int main()
{
    My::A<int> a;
    a.func();
    return 0;
}

Пишу на другом диалекте, но, вероятно, тут это не важно.
842
21 января 2010 года
sigmov
301 / / 16.09.2008
Цитата: Kogrom
Подозреваю, что придётся делать частичную специализацию шаблона. Как-то так:
Пишу на другом диалекте, но, вероятно, тут это не важно.



Да нет все как раз понятно....
Просто специализацию можно только 1 задать, а мне понадобяться как минимум 4: char, wchar_t, bool, int

Так что тема все еще актуальна

87
21 января 2010 года
Kogrom
2.7K / / 02.02.2008
Цитата: sigmov
Просто специализацию можно только 1 задать, а мне понадобяться как минимум 4: char, wchar_t, bool, int



Возможно, подойдёт что-то типа:

Код:
namespace My
{
    template<typename T> struct A;
    template<typename T> struct B;

    template<typename T> struct A
    {
        template<typename T2>
        B<T2> func() { return B<T2>(); }
    };

    template<typename T> struct B
    {
        template<typename T2>
        A<T2> func() { return A<T2>(); }
    };
}

int main()
{
    My::A<int> a;
    a.func<bool>();
    return 0;
}

Для лучшего решения надо знать, что ты делаешь.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог