【发布时间】:2018-09-04 10:09:30
【问题描述】:
尽管我使用显式模板实例化,您能否解释一下为什么我有 error: call of overloaded ‘func(const Test&)’ is ambiguous?
#include <iostream>
struct Test {
};
void func(const Test &) {
std::cout << "By Reference" << std::endl;
}
void func(const Test) {
std::cout << "By Value" << std::endl;
}
template <typename... TArgs>
void wrap(TArgs... args) {
func(args...);
}
int main() {
Test t;
wrap<const Test &>(t);
return 0;
};
编辑
模棱两可的原因是两个因素的结合。第一个是在调用func(args...) 中应用的简单重载规则。第二个是简单的函数不能被值和常量引用重载。为确保这一点,可以将调用 wrap<const Test &>(t) 替换为 func(static_cast<const Test &>(t))。错误仍然存在。
为了解决这个问题,可以使用func 的函数模板和@lubgr 提供的示例中所示的value vs const 引用模板专业化
感谢大家帮助我揭开这个概念的神秘面纱。
【问题讨论】:
-
即使不是模板,你的调用也是模棱两可的。
-
哪部分你不明白?