我是一个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);
任何帮助都将不胜感激。
答案 0 :(得分:4)
使用new
,您在堆上分配内存,因此您需要一个指向新分配内存的指针:MyObj<int>* s1 = new MyObj(1);
接下来,MyObj
是一个模板类,因此您在致电construtor时必须指定T
:MyObj<int>* s1 = new MyObj<int>(1);
由于s1
和s2
现在是指针,sum
无法接受它们作为指针,因此您需要尊重它们以获取值:sum(*s1, *s2);
正如@rgettman所指出的那样,this
是一个指针,因此必须使用->
而不是.
进行访问。