我有一些代码无法编译,这相当于一些东西 如下所示。经过一番挖掘,我遇到了 第14.1段注5,其中说明:
模板参数的顶级cv限定符将被忽略 在确定其类型时。
我的代码如下所示:
#include <iostream>
#include <typeinfo>
class Bar {};
template<class T>
void Func(T t)
{
std::cout << typeid(T).name() << "\n";
}
template<class T>
void Func(const T& t)
{
std::cout << "const ref : " << typeid(T).name() << "\n";
}
int main()
{
Bar bar;
const Bar& constBar = bar;
Func(constBar);
return 0;
}
它给出了这个编译错误:
In function 'int main()' error: call of overloaded 'Func(const Bar&)' is ambiguous
有人可以评论标准中此规则背后的原因吗?
答案 0 :(得分:4)
您的代码存在的问题是函数调用不明确。 const Bar&amp;可以匹配值或const引用。 G ++说:
xx.cpp:24: error: call of overloaded 'Func(const Bar&)' is ambiguous
这与模板无关 - 如果重载了非模板函数,则会出现相同的错误。
正如人们一再告诉你的那样,你不会通过阅读标准来学习C ++。
答案 1 :(得分:1)
调用不明确,因为任何可以匹配T
或const T &
。
试试Func(0);
:它会给出相同的错误消息。
答案 2 :(得分:1)
您可以轻松找到自己,这与模板无关。此
class Bar {};
void Func(Bar) {}
void Func(const Bar&) {}
int main()
{
Bar bar;
const Bar& constBar = bar;
Func(bar);
Func(constBar);
return 0;
}
给出了同样的错误。