C++ 两种模板类型之间的转换

C++ 两种模板类型之间的转换,c++,class,templates,initialization,type-conversion,C++,Class,Templates,Initialization,Type Conversion,我为一个类编写了这段代码(这是一个片段): 我得到这个错误: error: conversion from ‘Size {aka Pos2<short int>}’ to non-scalar type ‘Pos’ requested 错误:请求从'Size{aka Pos2}'转换为非标量类型'Pos' 这是有道理的,但我想知道如何修复它=p添加构造函数 template <typename Type2> Pos2(const Pos2<Type2> &

我为一个类编写了这段代码(这是一个片段):

我得到这个错误:

error: conversion from ‘Size {aka Pos2<short int>}’ to non-scalar type ‘Pos’ requested
错误:请求从'Size{aka Pos2}'转换为非标量类型'Pos'
这是有道理的,但我想知道如何修复它=p

添加构造函数

template <typename Type2> Pos2(const Pos2<Type2> &other)
{ x = other.x; y = other.y; }
模板Pos2(常量Pos2和其他)
{x=other.x;y=other.y;}
添加构造函数

template <typename Type2> Pos2(const Pos2<Type2> &other)
{ x = other.x; y = other.y; }
模板Pos2(常量Pos2和其他)
{x=other.x;y=other.y;}

您需要为从类型
Size
到类型
Pos
的分配定义一个分配运算符,因为它们不是同一类型,因此两者之间没有默认的分配运算符

我猜您想在这里使用一个模板,因此可以使用
Pos2
的任何实例化来分配给另一个实例化。例如:

template<typename T>
class Pos2 {
public:
    T x, y;

    Pos2() : x(0), y(0) {};
    Pos2(T xy) : x(xy), y(xy) {};
    Pos2(T x, T y) : x(x), y(y) {};

    template<typename FromT>
    Pos2<T>& operator=(const Pos2<FromT>& from) {
        x = from.x;
        y = from.y;
        return *this;
    }
};
模板
类Pos2{
公众:
tx,y;
Pos2():x(0),y(0){};
Pos2(txy):x(xy),y(xy){};
Pos2(tx,ty):x(x),y(y){};
模板
Pos2和运算符=(常量Pos2和from){
x=从.x开始;
y=从.y开始;
归还*这个;
}
};
您应该对复制构造函数(此处未显示)执行相同的操作,因为您可能希望在某个时刻在同一方案中复制构造

只有当类型
T
FromT
之间的赋值是可能的,即
pos\u scalar
size\u scalar
之间的赋值才有效。如果没有,请尝试为赋值运算符添加正确的显式转换和/或模板专门化


此外,如果
Pos2
的任何成员是私有/受保护的,则需要
与赋值运算符交朋友或提供足够的getter。

您需要为从类型
大小
到类型
Pos
的赋值定义赋值运算符,因为它们不是相同的类型,因此两者之间没有默认的赋值运算符

我猜您想在这里使用一个模板,因此可以使用
Pos2
的任何实例化来分配给另一个实例化。例如:

template<typename T>
class Pos2 {
public:
    T x, y;

    Pos2() : x(0), y(0) {};
    Pos2(T xy) : x(xy), y(xy) {};
    Pos2(T x, T y) : x(x), y(y) {};

    template<typename FromT>
    Pos2<T>& operator=(const Pos2<FromT>& from) {
        x = from.x;
        y = from.y;
        return *this;
    }
};
模板
类Pos2{
公众:
tx,y;
Pos2():x(0),y(0){};
Pos2(txy):x(xy),y(xy){};
Pos2(tx,ty):x(x),y(y){};
模板
Pos2和运算符=(常量Pos2和from){
x=从.x开始;
y=从.y开始;
归还*这个;
}
};
您应该对复制构造函数(此处未显示)执行相同的操作,因为您可能希望在某个时刻在同一方案中复制构造

只有当类型
T
FromT
之间的赋值是可能的,即
pos\u scalar
size\u scalar
之间的赋值才有效。如果没有,请尝试为赋值运算符添加正确的显式转换和/或模板专门化


此外,如果
Pos2
的任何成员是私有/受保护的,则需要
与赋值操作符交朋友或提供足够的getter。

什么是
Type2
?你是说
typename Type2
?什么是
Type2
?你是说
typename Type2
template<typename T>
class Pos2 {
public:
    T x, y;

    Pos2() : x(0), y(0) {};
    Pos2(T xy) : x(xy), y(xy) {};
    Pos2(T x, T y) : x(x), y(y) {};

    template<typename FromT>
    Pos2<T>& operator=(const Pos2<FromT>& from) {
        x = from.x;
        y = from.y;
        return *this;
    }
};