Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2013, 19:22   #1
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию forward declaration метода класса

Здравствуйте.
При использовании шаблонов, на мой взгляд, главной проблемой является перекрестное включение заголовков. Нужно использовать forward declaration. На эту тему вопрос:
Код:
class S;
void S::f();                // 3:11: error: invalid use of incomplete type 'class S'
void anyfn(S &instad_this);

template <typename T>
    void faa(T i) 
    { 
        S s;
        anyfn(s);
       // s.f();            // Как обеспечить работу этой строки?
    }
    
class S
{
public:
    void f() {}
};

void anyfn(S &instad_this) {}

int main()
{
    faa(5);
    return 0;
}
1. Как предварительно задекларировать метод f класса S? anyfn() это аналог требуемого результата, но она не член класса. Конечно можно обойтись ею, но хочу знать можно ли в принципе или нет.
2. Это ведь шаблон, зачем он так жестко проверяет типы до инстанцирования? Можно ли попросить компилятор повременить с s.f() до инстанцирования, как будто f() это _Ty::f(), где _Ty это тип переданный через аргументы шаблона? Типа этого:
Код:
template <typename T, typename _Ty = class S>
    void faa(T i) 
    { 
        _Ty s;
        s.f();
    }
    
class S
{
public:
    void f() {}
};

int main()
{
    faa(5);
    return 0;
}
Вопросы не привязаны к какому-то конкретному случаю, хочу определиться со стилем написания шаблонов.
220Volt вне форума Ответить с цитированием
Старый 25.12.2013, 22:51   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

1) Из внутренностей форвард декларейшна нельзя делать другие форвард декларейшны. Ни методы, ни вложенные типы.
2) Стандарт говорит по этому поводу так:
Цитата:
If a type used in a non-dependent name is incomplete at
the point at which a template is defined but is complete at the point at which an instantiation is done, and
if the completeness of that type affects whether or not the program is well-formed or affects the semantics of
the program, the program is ill-formed; no diagnostic is required. [ Note: If a template is instantiated, errors
will be diagnosed according to the other rules in this Standard. Exactly when these errors are diagnosed is
a quality of implementation issue. -- end note ]
т. е. авторы компилятора могут сами выбирать, когда им удобнее парсить ту часть шаблона, которая не зависит от его параметров. Майкрософтовский компилятор делает это на этапе инстанциации шаблона, например, потому в нем твой пример будет работать. А gcc проверяет корректность сразу, потому выдаст ошибку. Единственный способ отложить проверку - сделать так, чтобы конструкция как-то зависела от шаблонного параметра.
Son Of Pain вне форума Ответить с цитированием
Старый 25.12.2013, 23:21   #3
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Большое спасибо.
220Volt вне форума Ответить с цитированием
Старый 25.12.2013, 23:34   #4
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Красивое решение придумал (наверное и до меня кто-то делал):
Код:
template <typename _Type, typename>
    struct Decl_type
    {
        using type = _Type;
    };

class S;
    
template <typename T>
    void faa(T i) 
    {
        using stype_t = typename Decl_type<S, T>::type;
        stype_t s;
        s.f();
    }
    
class S
{
public:
    void f() {}
};

int main()
{
    faa(5);
    return 0;
}
PS
Чтобы лишнего не городить:
Код:
#include <type_traits>

template <typename T>
    void faa(T i) 
    {
        using stype_t = typename std::conditional<true, S, T>::type;
...

Последний раз редактировалось 220Volt; 25.12.2013 в 23:55.
220Volt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
forward declaration ? intmain Общие вопросы C/C++ 11 10.04.2013 21:20
Проблема с forward declaration Theseus Общие вопросы C/C++ 0 02.01.2013 19:17
Multiple declaration for при обявлению класса bumer7721 C++ Builder 3 09.11.2012 21:51
Forward declaration из чужого namespace futureteamleader Общие вопросы C/C++ 1 17.10.2009 04:46