Шаблонная специализация C++ конструктора

У меня есть шаблонный класс 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 (интервал)?

8
задан Martin York 14 December 2009 в 19:33
поделиться

3 ответа

Единственное, что вы не можете сделать, - это использовать 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; }
};
10
ответ дан 5 December 2019 в 07:58
поделиться

Вы не можете с вашим нынешним подходом. 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;
    }
  };
1
ответ дан 5 December 2019 в 07:58
поделиться

Предполагая, что ваш действительно предназначен для 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;
}
7
ответ дан 5 December 2019 в 07:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: