C ++相同的模板用于多个函数?

时间:2012-09-07 08:48:43

标签: c++ function templates

如何修改以下代码,以便即使在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()函数中使用相同或任何其他模板?总的来说,我需要使用模板本身管理所有功能。

3 个答案:

答案 0 :(得分:4)

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

应该有用。

问题可能是因为你有using namespace std;并且已经存在std::swap,所以这是不明确的。

答案 1 :(得分:0)

问题是你的#include引入了标准库std :: swap模板。因为您使用“using namespace std”,所以编译器无法分辨您要调用的函数,您或者标准库中的函数。

你有两个选择,要么停止使用“using namespace std”,要么明确要调用哪个交换函数,所以在你的调用函数中写“:: swap(x,y)”代替。

(请注意,您需要在调用函数的定义中加入“模板”)

答案 2 :(得分:-1)

你可以定义一个typdef或macro来缩小它。但建议放置模板定义,因为它使代码可读。您还可以将两个函数封装在一个模板类中。

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;
}