继承的构造函数和stl容器错误

时间:2015-03-18 17:38:40

标签: c++ c++11 inheritance stl inherited-constructors

我正在玩继承的构造函数,但是当我尝试从std :: string继承时,我很难理解为什么gcc会抱怨。

我知道这不是最佳做法,应该不惜一切代价避免,所以在对我大喊大叫之前,我没有在任何地方实施:-) 这只是为了纯粹的好奇心。

我也尝试过使用简单使用的定义类的相同场景,但我没有遇到同样的问题。

#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 个答案:

答案 0 :(得分:3)

不继承复制构造函数。您需要声明构造函数以获取T

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

也可能是非const和移动变体:

Wrapper(T& t):
    T(t){}
Wrapper(T&& t):
    T(std::move(t)){}