首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请圣人讲解讲解下面的代码,关于模板

2013-12-26 
请高人讲解讲解下面的代码,关于模板//.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>.
}

[解决办法]
引用:
template <class U> operator S<U>()
{
   return S<U>();
}

这个函数重载了什么操作符?返回的是什么类型?

这个不是操作符重载,应该是类型转换吧。返回了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大钞,老板地给你一个塑料袋,里面一个纸条,上写一包花生。
[解决办法]
引用:
//.NET 2003 引入的 Visual C++ 为模板化用户定义的转换支持。 下面的示例在 Visual C++ .NET 2003 中工作在该条件中指定。

// templated_user_defined_conversions.cpp
template <class T>
struct S
{
   T val;//加了这个,依然还是一个蒙人的模板,不过这回有陷了,不光是皮了
   //这是模板类的,模板方法(成员函数),模板的模板
   //只是这个转换函数就是个坑人的函数,
   //完全没做转换操作,转换结果和对象一点关系也没有。
   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<T>类型转成S<U>类型
比如
S<int> s1;
S<double> s2 = (S<double>)s1;

热点排行