1
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”没有在这个范围内声明。

我怎样才能做到这一点>

4

3 回答 3

2

Why not write a function template to do the work?

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

then

if(i==0)
  doStuff<int>();
else
  doStuff<float>();
于 2013-11-14T17:50:06.863 回答
0

问题是范围:

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 子句中做一个新的然后你可以在下面的代码中使用指针

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

于 2013-11-14T17:51:15.953 回答
0

这是因为 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
于 2013-11-14T17:59:54.713 回答