2017-01-27 1 views
-2

私はテンプレートを使ってC++継承の概念を練習しています。私は、この基本クラスを書いた:派生クラスオブジェクトから基本クラスメソッドを呼び出すときにエラーが発生しました。基本クラスと派生クラスの両方がテンプレート化されています

template <typename type1, typename type2> 
class baseClass { 
private: 
    type1 member1; 
    type2 member2; 

public: 
    baseClass() {}; 
    baseClass(type1 member1, type2 member2):member1(member1), member2(member2) {}; 
    type1 get_member1(); 
    type2 get_member2(); 
    ~baseClass() {}; 
}; 

と派生クラス:

template <typename type1, typename type2, typename type3> 
class derivedClass : public baseClass<type1, type2> { 
private: 
    type3 member3; 
public: 
    derivedClass(){}; 
    derivedClass(type1 member1, type2 member2, type3 member3): baseClass<type1, type2>(member1, member2), member3(member3){}; 
    type3 get_member3(); 
}; 

そして、私がメイン関数からこの操作をやっている:

int main(int argc, const char * argv[]) { 
    derivedClass<int, int, int> object(1, 2, 3); 
    cout << object.get_member1() << endl; 
    cout << object.get_member1() << " " << object.get_member2() << " " << object.get_member3() << endl; 
} 

とき、私コンパイラはエラーになります上記のプログラムをコンパイルしてみてください。私はこの問題をオンラインで検索しようとしましたが、具体的な答えは得られませんでした。私はC++のテンプレートが新しく、まだそれらを扱う方法を知らない。私はそれを把握するのを助けてください。ありがとう!

編集:get_member *メソッドの定義:

template <typename type1, typename type2> 
type1 baseClass<type1, type2>::get_member1() { 
    return member1; 
} 

template <typename type1, typename type2> 
type2 baseClass<type1, type2>::get_member2() { 
    return member2; 
} 

template <typename type1, typename type2, typename type3> 
type3 derivedClass<type1, type2, type3>::get_member3() { 
    return member3; 
} 
+1

?リンカー? – P0W

+0

'get_member1()'と 'get_member2()'の定義がありません – P0W

+0

ここに表示されているコードがすべてあなたのものであれば、get _...メソッドの定義がありません。 – Rene

答えて

0

はこちらをご覧ください:corrected-codeどのようなエラー(S)

#include <iostream> 
using namespace std; 

template <typename type1, typename type2> 
class baseClass { 
private: 
    type1 member1; 
    type2 member2; 

public: 
    baseClass() {} 
    baseClass(type1 member1, type2 member2):member1(member1), member2(member2) {} 
    type1 get_member1(){return member1;} 
    type2 get_member2(){return member2;} 
    virtual ~baseClass() {}; 
}; 

template <typename type1, typename type2, typename type3> 
class derivedClass : public baseClass<type1, type2> { 
private: 
    type3 member3; 
public: 
    derivedClass(){}; 
    derivedClass(type1 member1, type2 member2, type3 member3):  baseClass<type1, type2>(member1, member2), member3(member3){}; 
    type3 get_member3() {return member3;} 
    ~derivedClass(){} 
}; 


int main(int argc, const char * argv[]) { 
    derivedClass<int, int, int> object(1, 2, 3); 
    cout << object.get_member1() << endl; 
    cout << object.get_member1() << " " << object.get_member2() << " " << object.get_member3() << endl; 
    return 0; 
} 
+0

ちょっと、クラス内のget_member関数の定義が問題を解決していますが、別のcppファイルの関数の宣言で何が間違っているのか理解してください。更新された質問にコードを追加しました。ありがとう! – Monster

+0

ヘッダーファイルにbaseClassおよびderivedClassの宣言を指定し、別の.cppファイルを使用して関数の定義を追加できます。ヘッダーファイルを.cppファイルに含めることを忘れないでください。 – Rishi

+0

ええ、今はそうです。動作しません。 cppファイルで関数を定義した方法に問題がありますか? – Monster

関連する問題