为什么模板参数中的cv限定符被忽略?

时间:2010-07-29 11:21:33

标签: c++ templates

我有一些代码无法编译,这相当于一些东西 如下所示。经过一番挖掘,我遇到了 第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

有人可以评论标准中此规则背后的原因吗?

3 个答案:

答案 0 :(得分:4)

您的代码存在的问题是函数调用不明确。 const Bar&amp;可以匹配值或const引用。 G ++说:

xx.cpp:24: error: call of overloaded 'Func(const Bar&)' is ambiguous

这与模板无关 - 如果重载了非模板函数,则会出现相同的错误。

正如人们一再告诉你的那样,你不会通过阅读标准来学习C ++。

答案 1 :(得分:1)

调用不明确,因为任何可以匹配Tconst 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;
}

给出了同样的错误。