Пример использования правил частичного упорядочивания
using namespace std;
template <typename T>
void ShowArray( T arr[], int n);
template <typename T>
void ShowArray(T * arr[], int n);
struct debts
{
char name[50];
double amount;
};
int main(int argc, char* argv[])
{
int things[6]={13, 31, 103, 301, 310,130};
struct debts mr_E[3]=
{
{"Ima Wolfe", 2400.0},
{"Ura Foxe", 1300.0},
{"Iby Stout", 1800.0}
};
double *pd[3];
for(int i=0; i<3; i++) pd=&mr_E.amount;
cout<<"Listing Mr. E's counts of things:\n";
ShowArray(things,6);
cout<<"Listing Mr. E's debts:\n";
ShowArray(pd,3);
cin.get();
cin.get();
return 0;
}
template <typename T>
void ShowArray( T arr[], int n)
{
T sum=0;
cout<<"template A\n";
for(int i=0; i<n; i++)
sum+=arr;
cout<<"\nSum="<<sum<<' ';
cout<<endl;
}
template <typename T>
void ShowArray(T*arr[], int n)
{
T sum=0;
cout<<"template B\n";
for(int i=0; i<n; i++)
sum+=*arr;
cout<<"\nSum="<<sum<<' ';
cout<<endl;
}
Сигнатури в шаблонов разние но ошыбка следучая:
error C2667: 'ShowArray' : none of 2 overload have a best conversion
error C2668: 'ShowArray' : ambiguous call to overloaded function
ето при компиляцые:confused: компиль указывает на ShowArray(pd,3);
[color=red]Обрамляй код тегами [noparse]
Сигнатури в шаблонов разние но ошыбка следучая:
error C2667: 'ShowArray' : none of 2 overload have a best conversion
error C2668: 'ShowArray' : ambiguous call to overloaded function
ето при компиляцые:confused: компиль указывает на ShowArray(pd,3);
Какой компилятор?
У меня все построилось (VC 8.0), хотя код конечно отвратительный.
Давай зарефакторим для начала.
1. Странно, что используя С++ ты используешь С-style строки, а не std::string.
2. Задавать размер массива, если ты его тут же инициализируешь, не обязательно.
3. Я бы рекомендовал давать более значимые имена, как переменным, так и методам и типам. И использовать какую-нибудь одну нотацию определения имен.
4. Массивы в С++ передаются только по ссылке или по указателю!
5. Совсем недавно обсуждали, как можно использовать информацию типа массив. Если функция принимает аргумент типа массив, то нет необходимости передавать размер этого массива отдельным аргументом.
6. В циклах так же можно воспользоваться инф. из самого типа массив.
7. Нет никакой необходимости употреблять слово struct в определении переменной.
Т.о. код превратился в такой:
using namespace std;
template <typename T, int N>
void ShowArray(T (&arr)[N]);
template <typename T, int N>
void ShowArray(T* (&arr)[N]);
struct debts
{
string name;
double amount;
};
int main(int argc, char* argv[])
{
int things[] = {13, 31, 103, 301, 310,130};
debts mr_E[] = {
{"Ima Wolfe", 2400.0},
{"Ura Foxe", 1300.0},
{"Iby Stout", 1800.0}
};
const int mr_E_size = sizeof(mr_E)/sizeof(mr_E[0]);
double* pd[mr_E_size];
for(int i=0; i<mr_E_size; i++)
pd=&mr_E.amount;
cout << "Listing Mr. E's counts of things:" << endl;
ShowArray(things);
cout<<"Listing Mr. E's debts:" << endl;
ShowArray(pd);
cin.get();
return 0;
}
template <typename T, int N>
void ShowArray(T(&arr)[N])
{
T sum=0;
cout << "template A" << endl;
for(int i=0; i<N; i++)
sum += arr;
cout << "Sum=" << sum << ' ' << endl;
}
template <typename T, int N>
void ShowArray(T*(&arr)[N])
{
T sum=0;
cout << "template B" << endl;
for(int i=0; i<N; i++)
sum += *arr;
cout << "Sum=" << sum << ' ' << endl;
}
Собирается, запускается (VC 8.0).
5. Совсем недавно обсуждали, как можно использовать информацию типа массив. Если функция принимает аргумент типа массив, то нет необходимости передавать размер этого массива отдельным аргументом.
А дадите ссылку на это обсуждение?
У меня все построилось (VC 8.0), хотя код конечно отвратительный.
Давай зарефакторим для начала.
1. Странно, что используя С++ ты используешь С-style строки, а не std::string.
2. Задавать размер массива, если ты его тут же инициализируешь, не обязательно.
3. Я бы рекомендовал давать более значимые имена, как переменным, так и методам и типам. И использовать какую-нибудь одну нотацию определения имен.
4. Массивы в С++ передаются только по ссылке или по указателю!
5. Совсем недавно обсуждали, как можно использовать информацию типа массив. Если функция принимает аргумент типа массив, то нет необходимости передавать размер этого массива отдельным аргументом.
6. В циклах так же можно воспользоваться инф. из самого типа массив.
7. Нет никакой необходимости употреблять слово struct в определении переменной.
Во первых СПАСИБО за ответ, а теперь перейдём к вопросам :)
1.Меня интересуэт пункт первий твоего ответа, если не трудно наведи ко който пример а то ты сказал что я использую С- стиль и я никак не пойму вчем моя ошыбка?.
2. Что косаетсо 4-го ответа, то разве я не указатель передаю, я вычетал что arr[] воспринимаетса также как и *arr тоисть вродь всьо верно или я не прав?
1.Меня интересуэт пункт первий твоего ответа, если не трудно наведи ко който пример а то ты сказал что я использую С- стиль и я никак не пойму вчем моя ошыбка?.
{
char name[50]; <- это C-string вполне можно заменить на std::string
double amount;
};
2. Что косаетсо 4-го ответа, то разве я не указатель передаю, я вычетал что arr[] воспринимаетса также как и *arr тоисть вродь всьо верно или я не прав?
Верно, но в данном случае вполне можно передать массив, а не указатель на первый элемент.
[color=red]P.S. И пожалуйста, пиши по-русски.[/color]
5. Совсем недавно обсуждали, как можно использовать информацию типа массив. Если функция принимает аргумент типа массив, то нет необходимости передавать размер этого массива отдельным аргументом.
А дадите ссылку на это обсуждение?
Спасибо за приведенные ссылки.
Раньше думал, массив от указателя отличается лишь константностью (int var[5] === int * const var) и имеет различия лишь при инициализации. (Впрочем, такая дезинформация мне мало мешала :))
Теперь вижу, что действительно, информация о размере массива является частью типа массива, и эту информацию можно из типа извлечь и использовать. Поистине, очень удобно для статических массивов.