【发布时间】:2016-05-01 03:30:39
【问题描述】:
我在不小心将重载函数传递给可变参数函数模板时遇到了一个令人困惑的错误:
template<typename... Args>
void variadic(Args... args) {}
void overloaded() {}
void overloaded(int) {}
int main()
{
variadic(overloaded);
}
错误:
prog.cpp: In function 'int main()':
prog.cpp:9:24: error: too many arguments to function 'void variadic(Args ...) [with Args = {}]'
variadic(overloaded);
^
prog.cpp:2:6: note: declared here
void variadic(Args... args) {}
^
如果我用普通函数模板替换可变参数函数模板,我会收到更清晰的错误消息:
prog.cpp: In function 'int main()':
prog.cpp:9:25: error: no matching function for call to 'templated(<unresolved overloaded function type>)'
templated(overloaded);
^
prog.cpp:2:6: note: candidate: template<class Arg> void templated(Arg) void templated(Arg args) {}
^
prog.cpp:2:6: note: template argument deduction/substitution failed:
prog.cpp:9:25: note: couldn't deduce template parameter 'Arg'
templated(overloaded);
^
谁能解释为什么可变参数错误消息不同?我知道为什么会有一个,只是不知道为什么它与正常的模板错误不同。
我正在使用带有 C++14 的 g++ 5.2.1。
【问题讨论】:
-
你的代码有歧义,编译器应该如何决定将哪个
overloaded函数传递给variadic函数。 -
@t.niese 我知道是的。我只是想了解为什么这两个错误消息(可变参数与非可变参数)不同
-
Visual Studio 抱怨
error C2660: 'variadic': function does not take 1 arguments -
clang 告诉你
Candidate function not viable: requires 0 arguments, but 1 was provided的可变参数版本,我会假设因为它是模棱两可的,所以没有创建带有一个参数的variadic函数版本,因为你得到了传递错误参数计数的消息。对于模板版本,参数计数是固定的,因此对类型进行更具体的测试会失败。