PDA

View Full Version : سوال: template



هم دانشگاهی
جمعه 30 مهر 1389, 15:28 عصر
سلام دوستان

این کد کتاب آقای جعفر نژاد راجع به قالب تابع است. اما نمیدونم چرا Error میده.

اگه دوستان میتونن کمکم کنند! ممنونم


#include <iostream>
#include <conio.h>
using namespace std;
template <class X>
void swap(X &a,X &b)
{
X temp;
temp=a;
a=b;
b=temp;
}
int main()
{
int i=10,j=20;
swap(i,j);
cout<<i<<" "<<j;
getch();
return 0;
}

Salar Ashgi
جمعه 30 مهر 1389, 16:09 عصر
کدتان مشکل خاصی از لحاظ الگوریتم ندارد !
بنده در کامپایلر Borland قسمت using namespace std را حذف کردم و برنامه بدون اشکال اجرا شد ./

هم دانشگاهی
جمعه 30 مهر 1389, 16:33 عصر
وقتی کد رو در Dev اجرا میکنم از قسمت

swap(i,j);

Error میگیره ! واقعا نمیدونم چرا؟ آخه عین کد جعفر نژاد است!

Error:
17 E:\Dev-Cpp\Examples\WinMenu\template.cpp call of overloaded `swap(int&, int&)' is ambiguous
note E:\Dev-Cpp\Examples\WinMenu\template.cpp:8 void std::swap(_Tp&, _Tp&) [with _Tp = int]

Salar Ashgi
جمعه 30 مهر 1389, 18:07 عصر
به این شکل هم امتحان کنید :



swap(&i,&j);

هم دانشگاهی
جمعه 30 مهر 1389, 18:46 عصر
به اون شکل هم امتحان کردم!
اما خب با هم Error گرفت چون که اشاره گر نبود!
آخه واقعا چرا اشکال میگیره عین کد جعفر نزاد هستش!

Salar Ashgi
جمعه 30 مهر 1389, 19:20 عصر
اما خب با هم Error گرفت چون که اشاره گر نبود!
این اشاره گر نیست ، متغیر مرجع است .


آخه واقعا چرا اشکال میگیره عین کد جعفر نزاد هستش!
دلیل نمیشه که کد یه کتاب دقیقا درست و بی عیب و نقص اجرا بشه ؛ شاید کامپایلرها فرق بکنه و خیلی
شاید های دیگر ...
تو بورلند که مشکلی ایجاد نشد ، تو Dev طبیعتا باید به این شکل باشه و Error ای که گذاشته اید ، بیشتر
مربوط میشه به نحوه پاس دادن آرگومان ها به تابع .

هم دانشگاهی
جمعه 30 مهر 1389, 19:38 عصر
این اشاره گر نیست ، متغیر مرجع است .
.

خب وقتی & نمیزاریم اشاره گر نیست دیگه! تو خود تابع هم که * نزاشتیم.

خب پس اگر اشکالی نداره چرا run نمیشه؟

Mahmood_M
جمعه 30 مهر 1389, 21:04 عصر
در فایل iostream.h که به عنوان Header در کد شما Include شما ، NameSpace ای با نام std تعریف شده که دستوری به نام swap داره ، وقتی شما در ابتدای کدتون ( قبل از Main ) از عبارت " ;using namespace std " استفاده می کنید ، درواقع به کامپایلر میگید که برای دستوراتی که عضوی از std هستند ، خودش std رو جایگزین کنه تا نیازی به نوشتن دوباره ی std در ابتدای هر دستور مربوط به اون نباشه ، پس وقتی شما در بدنه ی Main از دستور swap استفاده میکنید ، کامپایلر ، با توجه به اینکه دستوری با نام swap عضوی از std هست ، دستور swap رو عضوی از اون در نظر میگیره ، درواقع به این صورت : std::swap(i, j);
حالا اگر بخواید تابعی با همون نام swap تعریف کنید ، باید اون رو Overload کنید ، خیلی ساده اگه بخوایم بگیم ، یعنی باید یک دستور swap دیگه به کامپایلر معرفی کنید و کامپایلر اون رو هم به عنوان دستور swap جداگانه در نظر بگیره ، اگر در شروع کار با مطالب کتاب هستید نیازی به Overload و ... نیست ( احتمالا در ادامه ی مباحث کتاب به Overloading هم میرسید ) ، کافیه که نام swap رو مثلا به myswap تغییر بدید ! ، یعنی کد نهایی میشه این :
#include <iostream>
#include <conio.h>

using namespace std;

template <class X>

void myswap(X& a,X& b)
{
X temp;
temp=a;
a=b;
b=temp;
}

int main()
{
int i=10,j=20;
myswap(i,j);
cout<<i<<" "<<j;
getch();
return 0;
}

پیغام خطایی که نمایش داده میشه هم مربوط به همون Overload هست ، متاسفانه در کتابهای آموزشی روی این موارد دقت کافی نمیشه ، یا توضیح مناسب داده نمیشه !

موفق باشید ...