我正在构建一个矩阵模板。有运营商,功能和所有工作正常。除非我尝试将双类型矩阵转换为int类型矩阵(反之亦然)。 =运算符无法定义,因此无法为类外部的basic_Matrix2D和basic_Matrix2D覆盖它。我知道我可以在class =运算符中编写来转换,但在这种情况下会有两个=运算符具有相同的参数。当使用double作为模板参数时,从double转换将与从模板参数转换相同。下面是类定义,可以从SourceForge
访问代码template <class _T> class basic_Matrix2D {
}
我还记得另一个关于模板的问题,转换为模板类型指针的工作原理,而转换为模板类型却没有。这可能是特定于编译器的。观察:
operator _T() {
return something;
}
operator _T*() {
return somethingelse;
}
提前致谢,
CEM
答案 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;
}
请注意,这可能被视为滥用运算符重载,这绝对不会使代码更清晰。