C ++, что означает этот синтаксис? - PullRequest
0 голосов
/ 09 июня 2010

Я нашел это в этом файле: http://www.boost.org/doc/libs/1_43_0/boost/spirit/home/phoenix/core/actor.hpp

Что означает этот синтаксис?

struct actor ... {
        ...
        template <typename T0, typename T1>
        typename result<actor(T0&,T1&)>::type // this line

Я знаю, что такое typename и шаблоны, мой вопрос о actor(T0&,T1&) синтаксисе

спасибо

Ответы [ 2 ]

3 голосов
/ 09 июня 2010

Полная декларация из этого файла гласит:

template <typename T0, typename T1>
typename result<actor(T0&,T1&)>::type
operator()(T0& _0, T1& _1) const
{
    /* snip */
}

Если разбить его на куски, легче читать:

template <typename T0, typename T1>

Это шаблон ...

operator()(...) const

... оператор функции вызова шаблонной функции ...

operator()(T0& _0, T1& _1) const

... который принимает два аргумента, по ссылке, типа T0 и T1 ...

typename result<...>::type

... и возвращает результат, типом которого является type член result ...

typename result<actor(T0&,T1&)>::type

... где тип result параметризуется выражением actor(T0&,T1&).

2 голосов
/ 09 июня 2010

Таким образом, это означает, что существует шаблон с именем result, а внутри результата - тип с именем type.

template <class T>
class result
{
public:
    typedef ... type;
};

Так что эта строка использует этот тип из шаблона.

Поскольку компилятор не знает, что такое result<actor(T0&,T1&)>::type, вам нужно использовать typename, чтобы сообщить компилятору, что он должен воспринимать его как тип.

Обновление

actor(T0&,T1&) - это функция, принимающая T0& и T1& и возвращающая actor по значению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...