Привет 🙂 Я осмотрелся по этому вопросу, и, похоже, было много постов, но ни один из ответов до сих пор не смог решить мою проблему. Если вы знаете о посте, который отвечает на этот конкретный вопрос, пожалуйста, дайте мне знать, какой из них, и я удалю этот пост.
Вот что я пытаюсь сделать; У меня есть класс с одним аргументом шаблона, значение которого по умолчанию соответствует специализации шаблона. Пока (см. Код ниже), он не компилируется. Меня беспокоит то, что похожий случай с два аргументы шаблона и частичная специализация шаблона компилируются и работают нормально ..: /
Что я делаю неправильно?
СЛУЧАЙ 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’. Спасибо заранее, что нашли время, чтобы прочитать это! 🙂
Bird
это учебный класс шаблон, поэтому вы всегда должны использовать угловые скобки. В отличие от функция шаблоны, если вы хотите использовать аргументы шаблона по умолчанию, вы можете их опустить, но угловые скобки должны быть там:
Bird<> b;
Других решений пока нет …