0
#ifndef ClassTemplate_HH
#define ClassTemplate_HH

using std::cout;
using std::endl;

template<typename T1,typename T2>
class myClass{
private:
     T1 I;
     T2 J;
public:
     myClass(T1 a, T2 b);//Constructor
     void show();
};

//这是构造函数
//注意这些格式
template <typename T1,typename T2>
myClass<T1,T2>::myClass(T1 a,T2 b):I(a),J(b){}

//这是void show();
template <typename T1,typename T2>
void myClass<T1,T2>::show()
{
     cout<<"I="<<I<<", J="<<J<<endl;
}

#endif

上記のヘッダーファイルでは、{}を削除できません。なぜですか?そして、それの目的は何ですか?

myClass<T1,T2>::myClass(T1 a,T2 b):I(a),J(b){}

以下はソースファイルです。

#include <iostream>
#include "ClassTemplate.h"

using std::cout;
using std::endl;

int main()
{
     myClass<int,int> class1(3,5);
     class1.show();

     myClass<int,char> class2(3,"a");
     class2.show();

     myClass<double,int> class3(2.9,10);
     class3.show();
}

また、エラーコンパイルの結果は次のとおりです。

$ g++ ClassTemplate_Test.cpp 
ClassTemplate_Test.cpp: In function ‘int main()’:
ClassTemplate_Test.cpp:12:36: error: invalid conversion from ‘const char*’ to ‘char’ [-fpermissive]
ClassTemplate.h:20:1: error:   initializing argument 2 of ‘myClass<T1, T2>::myClass(T1, T2) [with T1 = int, T2 = char]’ [-fpermissive]

それを解決する方法は?ありがとう

4

2 に答える 2

4
myClass<T1,T2>::myClass(T1 a,T2 b):I(a),J(b){}

これ{}がコンストラクターの関数本体全体です。すべての作業は初期化リストで行われるため、これは本質的に空のコンストラクターです。

ブレースがミル機能本体の実行にすぎないことを確認するために書き直すことができます。

myClass<T1,T2>::myClass(T1 a,T2 b)
   :I(a),J(b)
{

}

コンパイルエラーに関しては、「」から「」への簡単な修正で対処できます。

変化する

myClass<int,char> class2(3,"a");

myClass<int,char> class2(3,'a');

これは、型が。である文字列リテラル"a"として扱われるためです。一方、は、あなたとあなたのコンストラクターが期待するように扱われます。const char *'a'char

于 2013-01-02T07:27:51.327 に答える
3
myClass<T1,T2>::myClass(T1 a,T2 b):I(a),J(b){}

これは関数を定義します。関数には本体があります。関数の本体は、中括弧の間のものとして定義されます(つまり、{})。したがって、関数が空の場合でも、中かっこで定義する必要があります。

于 2013-01-02T07:27:58.760 に答える