Почему cv-квалификаторы в параметрах шаблона игнорируются? - PullRequest
2 голосов
/ 29 июля 2010

У меня был какой-то код, который не удалось скомпилировать, что составляет нечто как то, что показано ниже. Покопавшись, я наткнулся пункт 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 ]

4 голосов
/ 29 июля 2010

Проблема с вашим кодом в том, что вызов функции неоднозначен.Const Bar & может соответствовать либо значению, либо константной ссылке.G ++ говорит:

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

Это не имеет ничего общего с шаблонами - вы получите ту же ошибку, если перегрузите функцию без шаблона.со временем вы не будете изучать C ++, читая Стандарт.

1 голос
/ 29 июля 2010

Как вы могли легко найти сами, это не имеет ничего общего с шаблонами. Это

class Bar {};

void Func(Bar) {}
void Func(const Bar&) {}

int main()
{
    Bar bar;
    const Bar& constBar = bar;

    Func(bar);
    Func(constBar);

    return 0;
}

выдает те же ошибки.

1 голос
/ 29 июля 2010

Вызов неоднозначен, потому что что угодно может соответствовать T или const T &.

Просто попробуйте Func(0);: оно выдаст то же сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...