Как инициализировать элемент данных базового класса stai c в производном классе? - PullRequest
3 голосов
/ 03 августа 2020

Допустим, у меня есть такой класс, как

#include<iostream>
#include<string>

template<typename CharT>
class base
{
   //.....
public:
   using string_type = std::basic_string<CharT>;
   static inline string_type var;
   //.....
};

class derived : public base<char>
{
private:
   using base<char>::var;
public:
   static base<char>::string_type get()
   {
      return var;
   }
};

//template<>
//base<char>::string_type base<char>::var = "Value";

int main()
{
   std::cout << derived::get();
}

base, класс принимает тип char и создает строковый тип для этого класса, но я хочу использовать эту строку strng_type в class, поэтому я создал переменную static string_type, которая должна быть установлена ​​пользователем класса.

Для char значение равно "Value", а для wchar_t значение равно L"Value". поэтому я хочу скрыть var от пользователя, унаследовав класс в указанном типе (char), теперь, как инициализировать этот var.

Я попытался удалить inline и раскомментировать шаблон работает, но есть способ инициализировать inline static переменную базового класса.

  1. Как инициализировать встроенный stati базового класса c член данных?
  2. Это хороший идея сделать это?

1 Ответ

3 голосов
/ 03 августа 2020

Как инициализировать встроенный элемент stati c базового класса?

Удалите inline, и вы сможете инициализировать var

template<typename CharT>
class base
{
public:
   using string_type = std::basic_string<CharT>;
   static string_type var;
   // ^^^^^^^^^^^^^^^^^^^
};

template<>
base<char>::string_type base<char>::var = "Value";

template<>
base<wchar_t>::string_type base<wchar_t>::var = L"Value";

Это хорошая идея?

Не уверен в дизайне. Потому что то, что вы здесь упомянули

", я хочу скрыть var от пользователя, унаследовав класс указанного типа (char) [...] "

Похоже, он все еще доступен через

std::cout << base<char>::var;
...