请圣人讲解讲解下面的代码,关于模板
请高人讲解讲解下面的代码,关于模板//.NET 2003 引入的 Visual C++ 为模板化用户定义的转换支持。 下面的示
请高人讲解讲解下面的代码,关于模板
//.NET 2003 引入的 Visual C++ 为模板化用户定义的转换支持。 下面的示例在 Visual C++ .NET 2003 中工作在该条件中指定。
// templated_user_defined_conversions.cpp
template <class T>
struct S
{
template <class U> operator S<U>()
{
return S<U>();
}
};
int main()
{
S<int> s1;
S<long> s2 = s1; // Convert s1 using UDC and copy constructs S<long>.
}
[解决办法]这个不是操作符重载,应该是类型转换吧。返回了S<U>的类型。
[解决办法]相当于
template<>
struct S<int> {
template <>
operator S<long>() { // 重载到S<long>的类型转换运算符
return S<long>();
}
};
你如果不了解模板的话,再给你等价于
struct S_long;
struct S_int {
operator S_long() {
return s_long();
}
};
这个代码着实不是给人学习用的,这个类型转换可以说非常蛋疼,啥也没干。
[解决办法]// templated_user_defined_conversions.cpp
template <class T>
struct S
{
template <class U> operator S<U>()
{
return S<U>();
}
};
int main()
{
S<int> s1;
S<long> s2 = s1; // Convert s1 using UDC and copy constructs S<long>.
}
-----------------------------------
对于S<int> 相应的类型为:
struct S<int>
{
template <class U> operator S<U>()
{
return S<U>();
}
};
S<long> s2 = s1;
首先得把 s1从类型S<int>转化成 S<long>,故 S<int>中的类型转换实例化为:
operator S<long>()
{
return S<long>();
}
口说无凭,有反汇编为证:
S<int> s1;
S<long> s2 = s1; // Convert s1 using UDC and copy constructs S<long>.
0041139E lea eax,[s2]
004113A1 push eax
004113A2 lea ecx,[s1]
004113A5 call S<int>::operator<long> S<long> (4110F5h) [解决办法]这个代码,就是一张皮,其他什么也不做。
你要什么,他就给你什么,不过是空的,没有内容的。
[解决办法]这就像买炒货,你说老板,来包瓜子,“50块”,你给一张50大钞,老板地给你一个塑料袋,里面一个纸条,上写一包瓜子。
你说老板,来包花生,同样的,“50块”,你给一张50大钞,老板地给你一个塑料袋,里面一个纸条,上写一包花生。
[解决办法]这个模板里的,类型转换函数,就是拿来蒙人的。
[解决办法]类型转换操作 讲S<T>类型转成S<U>类型
比如
S<int> s1;
S<double> s2 = (S<double>)s1;