2015-11-30 215 views
3

我找不到任何類似的問題和我的谷歌搜索技能,所以希望SO能提供幫助。 (下面的示例頭部僞代碼)C++模板繼承

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類成員,即使它已經在使用繼承?

+0

當心:'廣場:: insert' *揣*'形狀<字符串,字符串>: :insert'。 – aschepler

+0

我怎樣才能調用形狀 ::插入Square的插入沒有專用對象聲明的類型形狀? (問題#2) – sl133

回答

6

1)什麼是繼承模板的通用基類 類的正確語法?

沒有什麼錯繼承的語法,你只需要指定你的基類的命名空間:

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

2)不類方形訪問someListOfPairs(不談論 它是私人的),例如當我打電話Square的插入(一對 字符串)時,它會調用Shape的插入(一對泛型)? (還怎麼會變成這樣實際上可以實現?)

你可以從你的Square成員函數通過以下方式調用Shapeinsert成員函數:

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

3)會我必須定義一個Shape someShape對象來正確使用Shape類成員,即使它已經在使用繼承了嗎?

是的,你必須初始化Square的構造函數的初始化列表的基類:

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

是的,我只是忘了那部分謝謝。 – sl133