错误:Class之前的预期类型说明符

时间:2016-03-28 16:41:05

标签: c++ templates generics

我是一个java开发人员,学习c ++。以下示例代码无法编译,我无法找到线索。

#include <iostream>
#include <cstdlib>
#include <string>
#include <stdexcept>

using namespace std;

template <class T>
class MyObj {

  public:
  T value;
  MyObj(T a){
      this.value = a;
  }
}; 

template <class T>
inline MyObj<T> const& sum(MyObj<T> const& a, MyObj<T> const& b) 
{ 
    // append copy of passed element 
    T result = a.value+b.value;
    MyObj<T> obj = new MyObj(result);

    return obj;
}

int main() 
{ 
    try {
        MyObj<int> s1 = new MyObj(1);
        MyObj<int> s2 = new MyObj(3);

        MyObj<int> s3 = sum(s1,s2);

        cout << s3.value <<endl; 
    } 
    catch (exception const& ex) {
        cerr << "Exception: " << ex.what() <<endl; 
        return -1;
    } 
} 

它返回 -

  

main.cpp:31:29:错误:'MyObj'之前的预期类型说明符            MyObj s1 = new MyObj(1);

  

main.cpp:32:29:错误:'MyObj'之前的预期类型说明符            MyObj s2 = new MyObj(3);

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:4)

使用new,您在堆上分配内存,因此您需要一个指向新分配内存的指针:MyObj<int>* s1 = new MyObj(1);

接下来,MyObj是一个模板类,因此您在致电construtor时必须指定TMyObj<int>* s1 = new MyObj<int>(1);

由于s1s2现在是指针,sum无法接受它们作为指针,因此您需要尊重它们以获取值:sum(*s1, *s2);

正如@rgettman所指出的那样,this是一个指针,因此必须使用->而不是.进行访问。