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