2016-03-28 8 views
-1

私はjavaを学び、C++を学んでいます。次のサンプルコードはコンパイルされず、手がかりを見つけることができませんでした。エラー:Classの前に予想される型指定子

#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: error: expected type-specifier before ‘MyObj’ MyObj s1 = new MyObj(1);

main.cpp:32:29: error: expected type-specifier before ‘MyObj’ MyObj s2 = new MyObj(3);

任意の助けいただければ幸いです。

+0

コンストラクタで 'this-> value = a;'または 'value = a;'だけです。 – rgettman

+0

どの本をお使いですか?または、あなたはただ推測していますか? –

+0

@BarryTheHatchetは、私が以前に言及したように、私はC++を学ぼうとするJava開発者です。私はネットtuttsに従っています。 –

答えて

4

newを使用すると、ヒープ上にメモリを割り当てている、とあなたがその新しく割り当てられたメモリを指すようにポインタを必要とする:MyObj<int>* s1 = new MyObj(1);

次に、MyObjはテンプレートクラスであるので、あなたは、あなたが呼び出すときTを指定する必要がありますコンストラクタ:sum(*s1, *s2);

:ポインタは今 MyObj<int>* s1 = new MyObj<int>(1);

s1のでとs2ポインタは、あなたが敬意を持っているとして、sumは、それらの値を得るためにそれらを受け入れることができません

@rgettmanが指摘したように、thisはポインタなので、->ではなく.を使用してアクセスする必要があります。

関連する問題