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 模板。因为您使用“使用命名空间 std”,所以编译器无法判断您要调用哪个函数,您的函数还是标准库中的函数。

你有两个选择,要么停止使用“使用命名空间标准”,要么明确说明你想调用哪个交换函数,所以在你的调用函数中写“::swap(x, y)”。

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

于 2012-09-07T08:58:36.063 回答
-1

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

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 回答