用户定义的强制转换是否可以在c ++中进行模板分辨率?

时间:2016-04-04 14:17:48

标签: c++ templates

将问题写入一个标题时我希望有人能够帮助我。我的问题是特定于C ++模板的,到目前为止我找不到任何有同样问题(或解决方案)的人。

基本上我写了一个矩阵类,它正在工作。我使用模板来确定元素的类型和矩阵的大小,因此大小是编译时常量,我不需要使用堆。 当我将矩阵与另一个矩阵相乘时,我可以使用tamplates来确定结果矩阵的维数。即使这似乎也有效。

现在我正在写一个Vector类。 (我认为)最好的方法是重用矩阵代码。所以在我的情况下,Vector< T,S>简单地继承自Matrix< T,S,1> (具有矢量宽度和高度1的矩阵)。现在的问题是矩阵与矢量或矢量与矢量的乘积。为了解决这个问题,我从Vector< T,S>创建了一个用户定义的强制转换。到矩阵< T,1,S> (注意,高度和宽度改变)。当我将向量与另一个向量相乘时,编译器无法解决此问题。

为了澄清这一切,我写了一些小抽象,所以亲爱的读者,你不必通过我的漏洞代码:

我们有两个班级:

template<int x, int y>
class Base;

template<int s>
class Child;

基本上Child从Base继承(Base是Matrix类,Child是Vector类)。

template<int X, int Y>
class Base
{
public:

    template <int X2>
    Base<X2, Y> operator * (const Base<X2, X> &multiplier)
    {
        return Base<X2, Y>();
    }
};

*运算符基本上是矩阵乘法部分(这里没有做任何事情)。由于乘法器矩阵的高度必须与乘法器矩阵的宽度相同,所以一切都很好,我只能进行有效的矩阵乘法。

template<int S>
class Child : public Base<S, 1>
{
public:
    operator Base<1, S>& ()
    {
        return *reinterpret_cast<Base<1, S>*>(this);
    }
};

这是一个带有强制转换操作符的向量类,不仅允许Vector * Matrix操作,还允许Matrix * Vector操作,因为Vector本身就是一个矩阵,甚至Vector * Vector也是可能的(至少在理论上是这样)。 问题是,一旦我尝试乘法,就会出现编译器错误。例如,此代码不起作用。

int main()
{
    Child<3> c1, c2;
    c1 * c2;
    return 0;
}

编译器似乎无法进行模板解析。当用gcc编译时,我甚至看到他试图将第二个向量转换为矩阵,但后来他说X2将不会被定义(尽管它是,因为Vector只有一种特殊类型的强制转换)。 p>

那么为什么这不可能? 如果不是,最好的方法是什么?

请不要告诉我,我不应该这样投。此类将始终为standard_layout类型,因此这是标准符合并且是执行强制转换的最有效方法。 但欢迎对这个问题进行任何认真的调查! 正如我所说,在我在这里提出问题之前,我尝试了解决/理解这个问题的所有内容。

0 个答案:

没有答案