У меня есть шаблонный класс A <T, интервал> и два определений типов <строка, 20> и <строка, 30>. Как я переопределяю конструктора для <строка, 20>? Следующее не работает:
template <typename T, int M> class A;
typedef A<std::string, 20> one_type;
typedef A<std::string, 30> second_type;
template <typename T, int M>
class A {
public:
A(int m) {test= (m>M);}
bool test;
};
template<>
one_type::one_type() { cerr << "One type" << endl;}
Я хотел бы класс A <станд.:: строка, 20>, чтобы сделать что-то, что не делает другой класс. Как я могу сделать это, не изменяя конструктора A:A (интервал)?
Единственное, что вы не можете сделать, - это использовать typedef
для определения конструктора. Кроме этого, вам следует специализировать конструктор A
следующим образом:
template<> A<string,20>::A(int){}
Если вы хотите, чтобы A
имел другое конструктор, а не общий конструктор A
, вам необходимо специализировать весь класс A
:
template<> class A<string,20> {
public:
A(const string& takethistwentytimes) { cerr << "One Type" << std::endl; }
};
Вы не можете с вашим нынешним подходом. one_type - это псевдоним для определенной специализации шаблона, поэтому он получает любой код, имеющийся в шаблоне.
Если вы хотите добавить код, специфичный для one_type, вы должны объявить его как подкласс специализации A, например:
class one_type:
public A<std::string, 20>
{
one_type(int m)
: A<str::string, 20>(m)
{
cerr << "One type" << endl;
}
};
Предполагая, что ваш действительно предназначен для A :: test
, чтобы быть общедоступным, вы можете сделать что-то вроде этого:
#include <iostream>
template <int M>
struct ABase
{
ABase(int n) : test_( n > M )
{}
bool const test_;
};
template <typename T, int M>
struct A : ABase<M>
{
A(int n) : ABase<M>(n)
{}
};
template <typename T>
A<T, 20>::A(int n)
: ABase<20>(n)
{ std::cerr << "One type" << std::endl; }
Убейте колеса:
int main(int argc, char* argv[])
{
A<int, 20> a(19);
std::cout << "a:" << a.test_ << std::endl;
A<int, 30> b(31);
std::cout << "b:" << b.test_ << std::endl;
return 0;
}