проблема с пакетом параметров шаблона функции - PullRequest
0 голосов
/ 30 мая 2019

Почему следующее не удается скомпилировать?

inline Obj init_output_string() { return open_output_string(); }

template<typename... Args>
Obj init_output_string(Args... prev, int last)
{
    Obj port(init_output_string(prev...));
    write_char(port, last);
    return port;
}

int ch1 = ...;
int ch2 = ...;
Obj port = init_output_string(ch1, ch2);

(ошибка 'init_output_string': no overloaded function takes 2 arguments для MSVC, g ++ дает похожую ошибку).

Но следующий вариант компилируется

inline Obj init_output_string() { return open_output_string(); }

template<typename... Args>
Obj init_output_string(int first, Args... rest)
{
    Obj port(init_output_string(rest...));
    write_char(port, first);
    return port;
}

int ch1 = ...;
int ch2 = ...;
Obj port = init_output_string(ch1, ch2);

Разница заключается в порядке написания символов.Я могу обойти это достаточно легко, но мне любопытно узнать, какое правило нарушает мой первый пример.

1 Ответ

1 голос
/ 30 мая 2019

Ваша конструкция плохо информирована.см. https://en.cppreference.com/w/cpp/language/parameter_pack

В шаблоне функции пакет параметров шаблона может появиться раньше в списке при условии, что все следующие параметры могут быть выведены из аргументов функции или иметь значение по умолчаниюАргументы:

приведенный пример (последний в вашем случае):

template<typename... Ts, typename U>
struct Invalid; // Error: Ts.. not at the end 

template<typename ...Ts, typename U, typename=void>
void valid(U, Ts...);  // OK: can deduce U

// void valid(Ts..., U); 
// Can't be used: Ts... is a non-deduced context in this position

проблема в том, "как определить, где остановить int для пакета"?ваша последняя часть int пакета или нет?

Представьте, что компилятор просто просматривает список параметров и должен непосредственно знать, где остановить пакет.

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