Может ли шаблонный аргумент по умолчанию соответствовать специализации?

Привет 🙂 Я осмотрелся по этому вопросу, и, похоже, было много постов, но ни один из ответов до сих пор не смог решить мою проблему. Если вы знаете о посте, который отвечает на этот конкретный вопрос, пожалуйста, дайте мне знать, какой из них, и я удалю этот пост.

Вот что я пытаюсь сделать; У меня есть класс с одним аргументом шаблона, значение которого по умолчанию соответствует специализации шаблона. Пока (см. Код ниже), он не компилируется. Меня беспокоит то, что похожий случай с два аргументы шаблона и частичная специализация шаблона компилируются и работают нормально ..: /

Что я делаю неправильно?


СЛУЧАЙ 1: Два аргумента шаблона (компилируется и работает)

заголовок

#include <iostream>

struct Special {};

template <class T, class U = Special>
class Bird
{
public:
inline void operator() () { sing(); }
inline void sing() const { std::cout << "Piu piu piu" << std::endl; }

private:
T t; U u;
};

template <class T>
class Bird<T,Special>
{
public:
inline void operator() () {}

private:
T t; Special u;
};

CPP

int main()
{
Bird<double,int> a;
Bird<double> b;

a(); b();
}

Случай 2: один шаблонный аргумент (не компилируется)

заголовок

#include <iostream>

struct Special {};

template <class U = Special>
class Bird
{
public:
inline void operator() () { sing(); }
inline void sing() const { std::cout << "Piu piu piu" << std::endl; }

private:
U u;
};

template <>
class Bird<Special>
{
public:
inline void operator() () {}

private:
Special u;
};

CPP

int main()
{
Bird<int> a;
Bird b;

a(); b();
}

Я получаю ошибку: пропущенные аргументы шаблона перед ‘b’. Спасибо заранее, что нашли время, чтобы прочитать это! 🙂

2

Решение

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

Bird<> b;
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]