从一个模板类转换为另一个模板类(都来自相同的基类)

时间:2015-12-09 17:25:57

标签: c++ templates inheritance vector

我已经四处寻找,但找不到我的问题的答案。我已经尝试了一段时间来使转换构造函数在我的派生类中工作,但无论我做什么,我都无法使它工作。

为了简单起见,我有一个抽象基类和两个(很快)派生类,它们都使用模板(它们是向量,因此它们使用模板来接受多种类型的元素)。一个是矢量,其大小由模板参数决定,另一个的大小取决于用于创建对象的参数。

我希望能够使用转换构造函数从一个转换为另一个。以下是这两个类的声明。我想我应该跳过这些功能的实现,因为它们很长并且在我看来与这个问题无关,但如果你认为有必要,我会把它添加到其余部分。

这是动态矢量类

template <class elem>
class Vect_variable : public Vect<elem>
{
    template <class T>
        friend std::ostream& operator<< (std::ostream&, const Vect_variable<T>&);

    template <class T>
        friend Vect_variable<T>& operator+ (T, const Vect_variable<T>&);
        // Pour les operations x+vecteur et pas vecteur+x avec int x

    template <class T>
        friend Vect_variable<T>& operator- (T, const Vect_variable<T>&);
        // Pour les operations x+vecteur et pas vecteur+x avec int x

    template <class T>
        friend Vect_variable<T>& operator* (T, const Vect_variable<T>&);
        // Pour les operations x+vecteur et pas vecteur+x avec int x

    public:
        Vect_variable(std::size_t sz = 0): taille(sz), vecteur(new elem[sz]) {};
        Vect_variable(std::size_t, const elem&);
        Vect_variable(const Vect_variable&);
        Vect_variable(Vect_variable&&);
        Vect_variable& operator=(const Vect_variable&);
        virtual elem& operator[] (std::ptrdiff_t nIndex);
        virtual const elem& operator[] (std::ptrdiff_t nIndex) const;
        virtual Vect_variable& operator+(); // + unaire
        virtual Vect_variable& operator-(); // - unaire
        virtual Vect_variable& operator+(const elem&); // + compos. par compos.
        virtual Vect_variable& operator-(const elem&); // - compos. par compos.
        virtual Vect_variable& operator*(const elem&); // * compos. par compos.
        virtual Vect_variable& operator+=(const elem&); // + compos. par compos.
        virtual Vect_variable& operator-=(const elem&); // - compos. par compos.
        virtual Vect_variable& operator*=(const elem&); // * compos. par compos.
        Vect_variable& operator+(const Vect_variable&); // + vect dynam.
        Vect_variable& operator-(const Vect_variable&); // - vect dynam.
        Vect_variable& operator*(const Vect_variable&); // * vect dynam.
        Vect_variable& operator+=(const Vect_variable&); // + vect dynam.
        Vect_variable& operator-=(const Vect_variable&); // - vect dynam.
        Vect_variable& operator*=(const Vect_variable&); // * vect dynam.
        ~Vect_variable () {delete[] vecteur ;}

    private:
        elem* vecteur;
        std::size_t taille;
};

以下是矢量,其大小由模板参数

确定
template <class elem, std::size_t taille=10>

class Vect_fixe: public Vect<elem>
{
    template <class T, std::size_t D>
        friend std::ostream& operator<< (std::ostream&, const Vect_fixe<T, D>&);

    template <class T, std::size_t D>
        friend Vect_fixe<T,D>& operator+ (T, const Vect_fixe<T, D>&);
        // Pour les operations x+vecteur et pas vecteur+x avec int x

    template <class T, std::size_t D>
        friend Vect_fixe<T,D>& operator- (T, const Vect_fixe<T, D>&);
        // Pour les operations x+vecteur et pas vecteur+x avec int x

    template <class T, std::size_t D>
        friend Vect_fixe<T,D>& operator* (T, const Vect_fixe<T, D>&);
        // Pour les operations x+vecteur et pas vecteur+x avec int x


    public:
        Vect_fixe() = default;
        Vect_fixe(const elem&);
        virtual elem& operator[] (std::ptrdiff_t nIndex);
        virtual const elem& operator[] (std::ptrdiff_t nIndex) const;
        virtual Vect_fixe& operator+() ; // + unaire
        virtual Vect_fixe& operator-(); // - unaire
        virtual Vect_fixe& operator+(const elem&); // + compos. par compos.
        virtual Vect_fixe& operator-(const elem&); // - compos. par compos.
        virtual Vect_fixe& operator*(const elem&); // * compos. par compos.
        virtual Vect_fixe& operator+=(const elem&); // + compos. par compos.
        virtual Vect_fixe& operator-=(const elem&); // - compos. par compos.
        virtual Vect_fixe& operator*=(const elem&); // * compos. par compos.
        Vect_fixe& operator+(const Vect_fixe&); // + vecteur meme taille
        Vect_fixe& operator-(const Vect_fixe&); // - vecteur meme taille
        Vect_fixe& operator*(const Vect_fixe&); // * vecteur meme taille
        Vect_fixe& operator+=(const Vect_fixe&); // + vecteur meme taille
        Vect_fixe& operator-=(const Vect_fixe&); // - vecteur meme taille
        Vect_fixe& operator*=(const Vect_fixe&); // * vecteur meme taille

        std::size_t get_size();
        elem get_vecteur();

    private:
        elem vecteur[taille] = {0};
        std::size_t size = taille;

};

所以我尝试使用一个构造函数来获取另一个类'类型的参数,但这似乎不起作用,因为来自另一个类的一些模板参数未声明(?),如果我声明它们它只是一直说无效的模板参数。我玩弄了很多但我无法找到正确的方法。缺乏对互联网的广泛了解(或者我自己的研究能力缺乏),但我被困住了。

无论如何,这背后的一般想法是使用那种东西:

Vect_variable(Vect_fixe<elem, taille>)

或最终以任何其他方式从一种类型转换为另一种类型。

2 个答案:

答案 0 :(得分:0)

前向声明,可能需要两个级别:

#include <cstdint>

template<class Elem>
struct base
{

};

// forward declare classes
template<class Elem> struct variable;
template<class Elem, size_t N> struct fixed;

//forward declare members
template<class Elem> struct variable : base<Elem>
{
    variable() = default;
    template<size_t N> variable(const fixed<Elem, N>& r);

    variable& operator += (const variable& r);

    template<size_t N>
    variable& operator += (const fixed<Elem, N>& r);

};

template<class Elem, size_t N> struct fixed : base<Elem>
{
    fixed() = default;

};

// define members

template<class Elem>
template<size_t N>
variable<Elem>::variable(const fixed<Elem, N>& r)
{
    // implementation here
}

template<class Elem>
auto variable<Elem>::operator += (const variable& r) -> variable&
{
    // implementation here
    return *this;
}

template<class Elem>
template<size_t N>
auto  variable<Elem>::operator += (const fixed<Elem, N>& r) -> variable&
{
    // implementation here
    return *this;
}


using namespace std;

auto main() -> int
{
    fixed<double, 10> fd;
    variable<double> vd(fd);

    vd += fd;

    return 0;
}

答案 1 :(得分:0)

我没有看到从Vect_variable转换为Vect_fixe的方法,后者要求大小为模板参数(在编译时保持不变),但仅限于获取Vect_variable大小的方法是在运行时。

但是,从Vect_fixe转换为Vect_variable时,我没有发现任何特殊问题:

template<std::size_t size> Vect_variable(const Vect_fixe<elem,size>& other) : Vect_variable(size)
{ 
  for (int i = 0; i < size; ++i)
  {
    (*this)[i] = other[i];
  }
}