【发布时间】:2014-07-05 09:22:51
【问题描述】:
我正在尝试将我的尾巴从 parser 转发到 add_option,但 GCC 不允许这样做:
// Templated constructor
template <typename H = std::string, typename... T>
parser(H head, T... tail) {
/* Add an option */
add_option(std::forward<T>(tail)...);
}
// Base case
void add_option(std::string head) {
/* Add an option */
}
// Recursive case
template <typename H = std::string, typename... T>
void add_option(H head, T... tail) {
add_option(tail...);
}
相反,GCC 给了我这个错误:
parser.h: In instantiation of ‘void parser::add_option(H, T ...) [with H = const char*; T = {}]’:
parser.h:16:4: required from ‘parser::parser(H, T ...) [with H = const char*; T = {const char*}]’
parser.cpp:7:26: required from here
parser.h:24:4: error: no matching function for call to ‘parser::add_option()’
add_option(tail...);
^
parser.h:24:4: note: candidates are:
parser.h:18:8: note: void parser::add_option(std::string)
void add_option(std::string head) {
^
parser.h:18:8: note: c1andidate expects 1 argument, 0 provided
parser.h:22:8: note: template<class H, class ... T> void parser::add_option(H, T ...)
void add_option(H head, T... tail) {
^
parser.h:22:8: note: template argument deduction/substitution failed:
parser.h:24:4: note: candidate expects 2 arguments, 0 provided
add_option(tail...);
^
Makefile:2: recipe for target 'parser' failed
make: *** [parser] Error 1
谁能告诉我我在这里做错了什么?我该如何解决这个问题?
【问题讨论】:
-
试试这个:void add_option() {}
-
你在两个
add_options 中都有严格的std::string参数要求,但你只能递归地传递泛型类型T参数。 -
您希望
add_option(string)终止递归 - 但您传递的实际参数是const char*,而不是string,模板化的add_option<const char*>是更好的匹配。 -
@IgorTandetnik 你的建议奏效了。如果您可以将此扩展为答案,我会将其标记为已解决。
-
我的建议?但我实际上并没有提出任何建议。我只是试图解释你看到的行为。
标签: c++ gcc c++11 variadic-templates perfect-forwarding