模板类型转换

时间:2009-09-14 19:54:09

标签: c++ templates

我正在构建一个矩阵模板。有运营商,功能和所有工作正常。除非我尝试将双类型矩阵转换为int类型矩阵(反之亦然)。 =运算符无法定义,因此无法为类外部的basic_Matrix2D和basic_Matrix2D覆盖它。我知道我可以在class =运算符中编写来转换,但在这种情况下会有两个=运算符具有相同的参数。当使用double作为模板参数时,从double转换将与从模板参数转换相同。下面是类定义,可以从SourceForge

访问代码
template <class _T> class basic_Matrix2D {

}

我还记得另一个关于模板的问题,转换为模板类型指针的工作原理,而转换为模板类型却没有。这可能是特定于编译器的。观察:

operator _T() {
   return something;
}

operator _T*() {
   return somethingelse;
}

提前致谢,
CEM

2 个答案:

答案 0 :(得分:5)

你的问题很不清楚,但是使运营商做出类似的事情并没有错:

// incomplete, but you get the idea
template<class U>
basic_Matrix2D<T> & operator=(const basic_Matrix2D<U> &x)
{
    rows = x.rows;
    cols = x.cols;
    data = new T[rows * cols];
    for (size_t i = 0; i < rows * cols; ++i)
        data[i] = x.data[i];
}

这将允许您从表达式T t; t = U();格式正确的任何矩阵中进行分配。如果你不能,它将无法编译。您还可以包含一个简单的basic_Matrix2D<T> & operator=(const basic_Matrix2D<T> &);赋值运算符 - 也许您可以获得一些额外的效率或其他内容。

答案 1 :(得分:1)

我认为提供“转换构造函数”并不罕见:

template <class U>
Matrix2D<T>(const Matrix2D<U>&)

这应该会自动使一切正常,例如

Matrix2D<double> a;
Matrix2D<int> b;
//implicitly uses the conversion constructor to create a temporary Matrix2D<double> from b
a += b; 

即使使临时对象太昂贵,也可以定义所有运算符,以便操作数可以是不同类型的矩阵。

然而,转换运营商是一个死胡同。他们只是浑水。

P.S我还看了一下你项目的参考资料。重新发明链表的目的是什么,特别是如果它的界面与SC ++ L完全不兼容? (甚至像wxWidgets这样的古老库也为他们的wxString提供了一个替代和首选的STL兼容接口。)


编辑:关于你的转换操作符问题,哪个编译器不用它编译?

template <class T>
struct X
{
    int n;

    operator T() { return n; }
    operator T*() { return &n; }
};

int main()
{
    X<int> x = {42};
    int a = x;
    int* b = x;
}

请注意,这可能被视为滥用运算符重载,这绝对不会使代码更清晰。