У меня есть этот шаблонный класс, который имеет функции-члены, и они не являются шаблонными функциями.
template <class T> class myclass {
T x;
public:
myclass(T a);
T getx() { return x; }
};
// Explicit specialization for int.
template <> class myclass<int> {
int x;
public:
myclass(int a) {
cout << "Inside myclass<int> specialization\n";
x = a * a;
}
int getx() { return x; }
};
int main()
{
myclass<int> i(10);
cout << "int: " << i.getx() << "\n";
myclass<double> d(10.1);
cout << "double: " << d.getx() << "\n\n";
myclass<float> f(5);
cout << "float: " << f.getx() << "\n";
return 0;
}
Я думал, смогу ли я специализировать свой конструктор, что-то вроде:
myclass<char>::myclass(char a)
{
x = a;
}
и я попробовал несколько разных способов, таких как:
template<class T>
myclass<T>::myclass(T a)
{
x = a;
}
template <>
myclass<char>::myclass(char a)
{
x = a;
}//Error: explicit specialization; 'myclass<char>::myclass(T)' has already been instantiated
, но мне не удалось это сделать. Я думал, так как моя функция конструктора не является функцией шаблона, это невозможно.
, но затем в этом коде:
template <class T>
class simpleClass
{
private:
T data;
public:
simpleClass(T n);
void show();
};
//*************
simpleClass<int>::simpleClass(int a)
{
data = a;
};
template <class T>
simpleClass<T>::simpleClass(T n)
{
data = n;
}
//******************
template <class T>
void simpleClass<T>::show()
{
cout << data << endl;
}
int main()
{
simpleClass<int> x(25);
cout << "int x = ";
x.show();
simpleClass<string> str("computer science");
cout << "string str = ";
str.show();
simpleClass<double> d(1.25);
cout << "double d = ";
d.show();
cin.get();
}
Я добавляю это:
simpleClass<int>::simpleClass(int a)
{
data = a;
};
и программа работала.
Я недавно узнал о шаблонах и не знаю, законно ли то, что я пытаюсь сделать, или нет, и если это возможно, как я могу это сделать?