Почему эта спецификация шаблона не работает для справки? - PullRequest
0 голосов
/ 28 сентября 2018

Рассмотрим следующий код, где у меня есть спецификация шаблона для ссылки на структуру.Кажется, что функция не распознает эту спецификацию и продолжает использовать исходное определение шаблона.

Если я избавлюсь от операторов & в спецификации шаблона, я получу работающую программу.

#include <iostream>
template <typename T>
T larger(T a, T b);

struct point
{
    double x;
    double y;
};

template <> point& larger(point & p1, point & p2);

int main()
{   
    using namespace std;
    point p1 = { 1.1, 2.2 };
    point p2 = { 3.3, 4.4 };
    point &q1 = p1; // this is already a reference to 'point'
    point &q2 = p2;
    point q3 = larger(q1, q2);  // neither this
    point q4 = larger(p1, p2);  // nor this works

    cin.get();
    cin.get();
}

template <typename T>
T larger(T a, T b)
{
    return a > b ? a : b;
}


template <> point& larger(point& p1, point& p2) 
{
    return p1.x*p1.y > p2.x * p2.y ? p1 : p2;
}

1 Ответ

0 голосов
/ 28 сентября 2018

Вывод аргумента шаблона - сложная вещь, между классификаторами, ссылками и т. Д. Вы можете легко потеряться.

Что вы можете сделать здесь, так это определить функцию шаблона как универсальнуюссылки:

struct point
{
    double x;
    double y;
};

template <typename T>
T larger(T&& a, T&& b)
{
    return a > b ? a : b;
}

template<> point& larger(point& p1, point& p2) 
{
    return p1.x*p1.y > p2.x * p2.y ? p1 : p2;
}

int main()
{   
    point p = { 1.1, 2.2 };
    point& rp = p;
    point max = larger(rp, rp); // deduced: point& larger<point&>(point&, point&)
}

демо: http://coliru.stacked -crooked.com / a / 78441512a5fa85aa


Или вы можете вообще избежать вывода аргумента шаблона:

template <typename T>
T larger(T a, T b)
{
    return a > b ? a : b;
}
// ...
point max = larger<point&>(rp, rp);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...