Унаследованная ошибка конструктора и контейнеров stl

Я играю с унаследованными конструкторами, однако у меня возникают проблемы с пониманием, почему gcc жалуется, когда я пытаюсь наследовать от std:: string.

Я знаю, что это не лучшая практика, и ее следует избегать любой ценой, поэтому, прежде чем кричать на меня за это, я ее нигде не реализую:-) Это просто для любопытства.

Я также попробовал тот же сценарий с простым используемым определенным классом, и у меня нет той же проблемы.

#include <string>
#include <vector>
#include <iostream>

using namespace std;

template <typename T>
struct Wrapper : public T
{
    using T::T;
};

struct A{
  A(int a) : _a(a) {} 
  int _a; 
};

int main()
{
   Wrapper<string> s("asd"); //compiles
   string a = "aaa";
   Wrapper<string> s2(a); //does not compile

   Wrapper<A> a(1);
   int temp = 1;
   Wrapper<A> b(temp);
}

выдержка из фактической ошибки:

main.cpp: 25: 24: ошибка: нет подходящей функции для вызова 'Wrapper<std::basic_string<char> >::Wrapper(std::string&)'

Wrapper<string> s2(a);

1 ответ

Конструкторы копирования не наследуются. Вы должны объявить конструктор, чтобы взять T

Wrapper(T const& t):
    T(t){}

и, возможно, неconst и двигать варианты тоже:

Wrapper(T& t):
    T(t){}
Wrapper(T&& t):
    T(std::move(t)){}
Другие вопросы по тегам