2017-04-03 47 views
0

我有以下直方图类的构造函数:接口作为模板参数

Histogram(float start, float end, float bin_size, std::vector<BinnableObject<T>*>* data); 

而继接口

template<typename T> 
class BinnableObject 
{ 
public: 
    virtual T getBinnableObject() = 0; 
}; 

我有一个类Ring实现此接口

template<class T> 
class Ring : BinnableObject<T> 
{ 
public: 
    Ring(Point<T> c, T r) 
    { 
     m_center = c; 
     m_radius = r; 
    } 
    Point<T> m_center; 
    T m_radius; 

    T getBinnableObject() 
    { 
     return m_radius; 
    } 
}; 

有我可以使用Rings矢量调用直方图构造函数吗?

Histogram<float> h(0.0f, 1.0f, 0.1f, &data.m_rings); 

其中&data.m_ringsstd::vector<Ring<float>*>

下面

#include <vector> 

template<typename T> 
class BinnableObject 
{ 
public: 
    virtual T getBinnableObject() = 0; 
}; 



template<class T> 
class Ring : public BinnableObject<T> 
{ 
public: 
    T m_radius; 
    T getBinnableObject() 
    { 
     return m_radius; 
    } 
}; 


template <typename T> 
class Histogram 
{ 
public: 
    Histogram(float start, float end, float bin_size, std::vector<BinnableObject<T> >* data) {}; 
}; 


int main() 
{ 
    std::vector<Ring<float>*> rings; 
    Histogram<float> h(0.0f, 1.0f, 0.1f, &rings); 
} 
+0

尝试调用没有明确说明类型参数,因为'疯牛病::直方图'是一个模板类,我以为'Histrogram'不是。 MCVE在这里会很有帮助。 – Gasper

+1

不需要。只要将构造函数作为模板,不要传递向量,像每个好公民一样传递一对迭代器。当然,避免生鱼指针。 –

回答

2

您遇到相关的事实,std::vector<Ring<T>>绝不继承的有关std::vector<BinnableObject<T>>不论问题MCVE RingBinnableObject

难道你不能让直方图成为模板化函数/构造函数吗?

template<class T> 
Histogram(float, float, float, std::vector<T>); 
+0

对不起,迟到了 - 我正在睡觉:) – Philipp