Doing
template <class T>
struct MyType
{
public:
T cont;
MyType(T value) : cont(value) {}
MyType(int value = 1) : cont(value) {}
MyType(double value = 1.2) : cont(value) {}
};
int main()
{
MyType <int> a;
return 0;
}
у вас есть два идентичных конструктора MyType(int value = 1)
и MyType(T/*int*/ value)
, вы не можете иметь эту перегрузку
Мне нужен способ сделать это без копирования всех классов для каждой специализации.
Вы можете иметь
#include <iostream>
using namespace std;
template <class T>
struct MyType
{
public:
T cont;
MyType(T value = 1) : cont(value) {}
};
template<>
MyType<int>::MyType(int value) : cont(value + 1) {}
template<>
MyType<double>::MyType(double value) : cont(value + 2) {}
int main()
{
MyType <int> a;
MyType <int> aa(10);
MyType <double> b;
cout << a.cont << '/' << aa.cont << '/' << b.cont << endl;
return 0;
}
но вы не можете указать другое значение по умолчанию для параметра специализации (error: default argument specified in explicit specialization [-fpermissive]
), поскольку, как обычно, значение по умолчанию указано в объявлении, а не в определении
Компиляция и исполнение
pi@raspberrypi:/tmp $ g++ -pedantic -Wextra -Wall t.cc
pi@raspberrypi:/tmp $ ./a.out
2/11/3