class 个模板中的转换运算符
Conversion operators in class templates
我有两个 class 模板 TemplateA<T>
和 TemplateB<T>
。现在,我想在 TemplateB<T>
中定义一个转换运算符,以便允许从 TemplateB<T>
到 TemplateA<T>
的隐式类型转换。但是,以下代码会产生编译错误:
struct ClassA {};
template<typename T>
struct TemplateA {
T val;
};
template<typename T>
struct TemplateB {
T val;
template<typename ValT>
operator TemplateA() const {
TemplateA<ValT> a;
a.val = val;
return a;
}
};
int main() {
TemplateB<ClassA> b;
TemplateA<ClassA> a = b;
return 0;
}
错误:
main.cpp:13:12: error: expected type-specifier before 'TemplateA'
operator TemplateA() const {
^
模板参数构成类型定义的一部分,因此您不能在转换运算符中省略它:
template<typename ValT>
operator TemplateA<ValT>() const {
TemplateA<ValT> a;
a.val = val;
return a;
}
认为编译器会将模板化类型附加到模板的计算类型上会有所帮助。因此,您的代码将生成类似 operator TemplateA_ClassA() const
的内容,用于将 TemplateB_ClassA
转换为 TemplateA_ClassA
。
I want to define a conversion operator in TemplateB<T>
to allow implicit type conversions from TemplateB<T>
to TemplateA<T>
不需要转换函数模板。一个简单的转换函数就可以:
operator TemplateA<T>() const {
TemplateA<T> a;
a.val = val;
return a;
}
仅当您希望允许从 TemplateB<Foo>
转换为 TemplateA<Bar>
时才需要模板。
除了 之外,您还可以选择其他方式来定义转换 - 您可以添加 TemplateB
而不是向 TemplateB
添加 [非模板] 转换函数非模板] 将构造函数转换为 TemplateA
:
template<typename T>
struct TemplateB {
T val;
};
template<typename T>
struct TemplateA {
T val;
TemplateA() = default;
// converting constructor
TemplateA(TemplateB<T> const& t)
: val(t.val)
{ }
};
我有两个 class 模板 TemplateA<T>
和 TemplateB<T>
。现在,我想在 TemplateB<T>
中定义一个转换运算符,以便允许从 TemplateB<T>
到 TemplateA<T>
的隐式类型转换。但是,以下代码会产生编译错误:
struct ClassA {};
template<typename T>
struct TemplateA {
T val;
};
template<typename T>
struct TemplateB {
T val;
template<typename ValT>
operator TemplateA() const {
TemplateA<ValT> a;
a.val = val;
return a;
}
};
int main() {
TemplateB<ClassA> b;
TemplateA<ClassA> a = b;
return 0;
}
错误:
main.cpp:13:12: error: expected type-specifier before 'TemplateA'
operator TemplateA() const {
^
模板参数构成类型定义的一部分,因此您不能在转换运算符中省略它:
template<typename ValT>
operator TemplateA<ValT>() const {
TemplateA<ValT> a;
a.val = val;
return a;
}
认为编译器会将模板化类型附加到模板的计算类型上会有所帮助。因此,您的代码将生成类似 operator TemplateA_ClassA() const
的内容,用于将 TemplateB_ClassA
转换为 TemplateA_ClassA
。
I want to define a conversion operator in
TemplateB<T>
to allow implicit type conversions fromTemplateB<T>
toTemplateA<T>
不需要转换函数模板。一个简单的转换函数就可以:
operator TemplateA<T>() const {
TemplateA<T> a;
a.val = val;
return a;
}
仅当您希望允许从 TemplateB<Foo>
转换为 TemplateA<Bar>
时才需要模板。
除了 TemplateB
而不是向 TemplateB
添加 [非模板] 转换函数非模板] 将构造函数转换为 TemplateA
:
template<typename T>
struct TemplateB {
T val;
};
template<typename T>
struct TemplateA {
T val;
TemplateA() = default;
// converting constructor
TemplateA(TemplateB<T> const& t)
: val(t.val)
{ }
};