C++模板继承

C++ Template Inheritance

本文关键字:继承 C++      更新时间:2023-10-16

我在谷歌搜索方面找不到任何类似的问题,所以希望so能提供帮助。(下面的样本标题伪代码)

namespace randomNamespace{
template <typename A, typename B>
class Shape{
    public:
        Shape(int);
        ~Shape();
        bool insert(std::pair<A,B> ab);
    private:
        std::vector<std::pair<A,B> > someListOfPairs;
};
}
class Square : public Shape<string, string>     //causes error requiring template before '<'
{
public:
    Square(int);    //When defined it is Square(int x) : Shape(x); as an initialization list to call superclass constructor
    ~Square();
    bool insert(std::pair<string, string> p);
private:
    //Shape<string, string> someShape    -- see question #3
};

1) 继承模板的泛型基类的正确语法是什么?

2) Class-Square是否可以访问someListOfPairs(不是说它是私有的),例如当我调用Square的insert(一对字符串)时,它会调用Shape的insert(一对泛型类型)?(此外,这将如何实际实施??)

3) 我是否必须定义Shape someShape的对象才能正确使用Shape类成员,即使它已经在使用继承?

1) 继承模板的泛型基的正确语法是什么班

继承的语法没有错,只需要指定基类的名称空间:

class Square : public randomNamespace::Shape<std::string, std::string> { ...
                      ^^^^^^^^^^^^^^^

2) Class Square是否可以访问某些ListOfPairs(而不是谈论它是私有的),例如当我调用Square的insert(对字符串),然后它将调用Shape的insert(一对泛型类型)?(此外,这将如何实际实施??)

您可以通过以下方式从Square的成员函数调用Shapeinsert成员函数:

bool Square::insert(std::pair<std::string, std::string> p) {   
  randomNamespace::Shape<std::string, std::string>::insert(p);
  // ... 
  return true; 
}

3) 我是否必须定义一个形状为someShape的对象才能正确使用Shape类成员,即使它已经在使用继承?

是的,您必须初始化Square构造函数的初始化器列表中的基类:

Square::Square(int a) : randomNamespace::Shape<std::string, std::string>(a) {}