【问题标题】:single template object for multiple data types多种数据类型的单个模板对象
【发布时间】:2013-11-15 01:59:54
【问题描述】:
class mypair {
    T a, b;
  public:
    mypair (T first, T second)
      {a=first; b=second;}
    T getmax ();
};

template <class T>
T mypair<T>::getmax ()
{
  T retval;
  retval = a>b? a : b;
  return retval;
}

int main () {
  int i;
  cin>>i;
  if(i==0)
      mypair <int> myobject (100, 75);
  else
      mypair <float> myobject (100, 75);

  cout << myobject.getmax();
  return 0;
}

我想根据 i 的值创建模板类的单个对象。如果 i 的值为 0,则创建数据类型为 int 的模板类,否则为 float。 上面的程序在我调用 getmax 函数的最后第二行的这个范围内没有声明“myobject”错误。

我怎样才能做到这一点>

【问题讨论】:

  • 另外 myobject 只有在 if else 块中有作用域。在上面声明它并让它在 if else 块中分配
  • @JamilSeaidoun 但是要在if 之前声明它,我们需要“类型”信息,我们需要i 来确定类型

标签: c++ templates


【解决方案1】:

为什么不写一个函数模板来完成这项工作?

template <typename T>
doStuff()
{
  mypair <T> myobject (100, 75);
  std::cout << myobject.getmax();
}

然后

if(i==0)
  doStuff<int>();
else
  doStuff<float>();

【讨论】:

    【解决方案2】:

    问题是范围:

    if(i==0)
    {
          mypair <int> myobject (100, 75);
    } // myobject is now out of scope and unusable
      else
    {
          mypair <float> myobject (100, 75);
    }  // myobject is now out of scope and unusable
    

    您需要为模板声明一个非模板基础 然后你可以声明一个指向基址的指针 在你的 if 子句中做一个新的 那么你可以在下面的代码中使用指针

    顺便说一句,即使对于单行块,始终包含 {} 通常也很有帮助

    【讨论】:

      【解决方案3】:

      这是因为 if 和 else 情况的范围.. 您可以通过这样做来实现这一目标

      if(i==0){
        mypair <int> myobject (100, 75);
        cout << myobject.getmax();
      } 
      else{
        mypair <float> myobject (100, 75);
        cout << myobject.getmax();
      }
      

      由于对象在 if 范围内是活动的,而在 else 范围之外的对象将是死的。

      if{
           // alive scope
       }
       //dead scope
      

      【讨论】:

        猜你喜欢
        • 2012-10-11
        • 2020-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-09
        • 1970-01-01
        • 2019-08-20
        • 1970-01-01
        相关资源
        最近更新 更多