1

call() 関数でも同じテンプレート T を使用できるように、以下のコードを変更するにはどうすればよいですか?

#include<iostream>

using namespace std;

template<class T>
void swap(T &x,T &y)
{
 T temp=x;
 x=y;
 y=temp;
}

/*if i use again the"template<class T>" here i have the error "Identifier T is 
undefined" to be gone but then if i compile i have several other errors.. like  
"could be 'void swap<T>(T &,T &)' " and some other errors*/

void call(T &x,T &y)
{
 swap(x,y);
 cout<<x<<y;
}

int main()
{
 int num;
 cout<<"Enter 1 or 0 for int or float\n";
 cin>>num;
 if(num)
 {
  int a,b;
  cin>>a>>b;
  call(a,b);
 }
 else 
 {
  float a,b;
  cin>>a>>b;
  call(a,b);
 }
}

テンプレート関数は、先頭のテンプレート宣言に関連付けられています。同じテンプレートを別の機能に再度使用することはできませんか? call() 関数で同じテンプレートまたは他のテンプレートを使用できるように、上記のコードを変更する他の方法はありますか? 全体として、テンプレート自体を使用してすべての機能を管理する必要があります。

4

3 に答える 3

4
template <typename T>
void call(T &x, T &y)
{
   swap(x, y);
   cout << x<< y;
}

動作するはずです。

問題はおそらくあなたが持っていてusing namespace std;、すでに存在するstd::swapため、あいまいです。

于 2012-09-07T08:50:43.820 に答える
0

問題は、 #include が標準ライブラリ std::swap テンプレートを取り込んでいることです。「using namespace std」を使用しているため、コンパイラは、呼び出したい関数、または標準ライブラリの関数を判断できません。

「名前空間 std の使用」の使用をやめるか、呼び出すスワップ関数を明示するかの 2 つの選択肢があるため、呼び出し関数で代わりに「::swap(x, y)」と記述します。

(呼び出し関数の定義に「テンプレート」を入れる必要があることに注意してください)

于 2012-09-07T08:58:36.063 に答える
-1

typdef またはマクロを定義して小さくすることができます。ただし、コードが読みやすくなるため、テンプレート定義を配置することをお勧めします。また、テンプレートであるクラスに 2 つの関数をカプセル化することもできます。

template<class T>
class XYZ {

void swap(T &x,T &y)
{
 T temp=x;
 x=y;
 y=temp;
}

void call(T &x,T &y)
{
 swap(x,y);
 cout<<x<<y;
}
}

または、クラスを使用したくない場合も使用したくない場合は、次のようにしますtemplate<class T>

#define templateFor(T) template<class T>

templateFor(T)
void swap(T &x,T &y)
{
 T temp=x;
 x=y;
 y=temp;
}


templateFor(T)
void call(T &x,T &y)
{
 swap(x,y);
 cout<<x<<y;
}
于 2012-09-07T08:51:22.243 に答える