cin>>函数模板未知类型的arg

时间:2016-07-14 05:13:08

标签: c++ templates

我有一个功能模板和main如下:

 template <class type > type* calculate(type inputVal) {
       type val;
       static int counter = 0;
       static type sum = inputVal;
       static type average = inputVal;
       static type* address = &sum

       do {
          cout << "Enter value: ";
          cin >> val;
          counter++;
          sum += val;
          average = sum / counter;
       } while (!cin.eof());
      return address;
 }

void main() {
      int num;
      cout << "Enter Value: ";
      cin >> num;
      int *ptr = calculate(num);
      cout << "SUM: " << *ptr << " AVG: " << *(ptr+1);
 }

我的问题是,这应该适用于不同的输入类型,而不仅仅是int,所以如果用户首先输入一个浮点数,它将把所有内容都视为该类型,就像用户输入一个char一样。

模板功能也无法打印结束值。

1 个答案:

答案 0 :(得分:1)

正常变量sum被视为指针aritimetic(N3337 5.7添加运算符)的单元素数组,当ptr指向它时,ptr+1不会指向有效对象,因此不得取消引用。 如果您想要连续的内存区域,请使用数组。

另请注意

  • 更新!cin.eof()sum后检查average似乎不太好主意,因为它会使用无效(重复)数据。在处理数据之前检查输入是否成功
  • 在标准C ++中,在全局命名空间中声明void main()(或main的返回类型不是int)是非法的。除非您有某些特殊原因 - 例如,您的老板或老师禁止编写符合标准的代码 - 您应该使用int main()(在这种情况下)。
  • 您应该将counter初始化为1,以便将inputVal放入该号码中。避免将输入作为参数以避免编写重复代码似乎更好。

试试这个:

#include <iostream>
using std::cin;
using std::cout;

template <class type > type* calculate(type inputVal) {
  type val;
  static int counter = 1;
  static type buffer[2];
  type& sum=buffer[0];
  type& average=buffer[1];
  sum=average=inputVal;
  static type* address = buffer;

  for(;;) {
    cout << "Enter value: ";
    if(!(cin >> val)) break;
    counter++;
    sum += val;
    average = sum / counter;
  }
  return address;
}

int main() {
  int num;
  cout << "Enter Value: ";
  cin >> num;
  int *ptr = calculate(num);
  cout << "SUM: " << *ptr << " AVG: " << *(ptr+1);
}

或者没有来自参数的输入:

#include <iostream>
using std::cin;
using std::cout;

template <class type > type* calculate() {
  type val;
  static int counter = 0;
  static type buffer[2];
  type& sum=buffer[0];
  type& average=buffer[1];
  sum=0; // the type used has to be capable to be converted from integer 0
  average = 0;
  static type* address = buffer;

  for(;;) {
    cout << "Enter value: ";
    if(!(cin >> val)) break;
    counter++;
    sum += val;
    average = sum / counter;
  }
  return address;
}

int main() {
  int *ptr = calculate<int>();
  cout << "SUM: " << *ptr << " AVG: " << *(ptr+1);
}