Поведение вывода аргументов шаблона с аргументами по умолчанию - PullRequest
0 голосов
/ 31 октября 2019

EDITED (Оригинальный вопрос имел только int A, int B):
Вывод аргумента шаблона работает, как и ожидалось, когда #arguments, сравниваемые между специализациями, одинаков, но завершается ошибкой, когда они отличаются (из-за включения параметров по умолчанию, включенных водна из специализаций).

Например: почему вычет аргумента шаблона не срабатывает в одном случае по сравнению с другим, может ли кто-то указать на какие-либо ресурсы / стандарты, где это объясняется?

// Example program
#include <iostream>

template <int A, int B, int C, int D=1>
class Foo;

template <int A, int B, int C>
class Foo <A, B, C>
{
public:
    int a;

    Foo()
    {
        a = 0;
    }
};

template <int D>               // Fails compilation
class Foo <1, 1, 1, D>         // Fails compilation
//template <>                  // works, prints a = 1
//class Foo <1, 1, 1>          // works, prints a = 1
{
public:
    int a;

    Foo()
    {
        a = 1;
    }
};


int main()
{
    Foo <1, 1, 1, 1> f;
    std::cout << "a = "<< f.a << std::endl;
}

ошибка: неоднозначная реализация шаблона для класса 'Foo <1, 1, 1, 1>'

1 Ответ

1 голос
/ 31 октября 2019
template <int A>
class Foo <A> {/*..*/};

с аргументом по умолчанию:

template <int A>
class Foo <A, 1> {/*..*/};

С (действительным):

template <int B>
class Foo <1, B> { /*..*/ };

У вас есть неоднозначность для Foo<1, 1>, как Foo<A, 1>, так и Foo<1, B>соответствует, но ни один из них не является более специализированным.

template <> class Foo <1> { /**/};

равен

template <> class Foo <1, 1> { /**/};

и более специализирован, чем обе предыдущие специализации.

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