C++模板继承

3

我通过谷歌搜索没有找到类似的问题,希望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) 类Square是否可以访问someListOfPairs(不是私有的),例如当我调用Square的insert(pair of strings)时,它会调用Shape的insert(pair of generic type)?(此外,这实际上如何实现?)

3) 即使已经使用了继承,是否仍需要定义一个Shape对象someShape来正确使用Shape类成员?


注意:Square::insert 隐藏 Shape<string,string>::insert - aschepler
我该如何在Square的insert中调用Shape<A,B>::insert,而不需要声明一个类型为shape的专用对象?(问题#2) - sl133
1个回答

6

1) 如何正确继承模板化的基类?

继承语法没有问题,您只需要指定基类的命名空间即可:

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

2) Class Square是否可以访问someListOfPairs(不是私有的),例如当我调用Square的insert(pair of strings)时,它会调用Shape的insert(pair of generic type)?(这实际上如何实现??)

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

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

3)即使它已经使用了继承,我是否需要定义一个Shape对象来正确使用Shape类成员?

是的,您需要在Square构造函数的初始化列表中初始化基类:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接