Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Пример использования правил частичного упорядочивания

18K
07 августа 2007 года
Avenger
25 / / 23.02.2007
Код:
#include "iostream"
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]
 
Код:
 
[/noparse][/color]
3
07 августа 2007 года
Green
4.8K / / 20.01.2000
Цитата: Avenger

Сигнатури в шаблонов разние но ошыбка следучая:

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 в определении переменной.

Т.о. код превратился в такой:

Код:
#include "iostream"
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).
350
08 августа 2007 года
cheburator
589 / / 01.06.2006
Green:
5. Совсем недавно обсуждали, как можно использовать информацию типа массив. Если функция принимает аргумент типа массив, то нет необходимости передавать размер этого массива отдельным аргументом.
А дадите ссылку на это обсуждение?
240
08 августа 2007 года
aks
2.5K / / 14.07.2006
http://forum.codenet.ru/showthread.php?t=40638&page=2
3
08 августа 2007 года
Green
4.8K / / 20.01.2000
Конкретно примеры здесь:
http://forum.codenet.ru/showthread.php?p=205152#post205152
18K
08 августа 2007 года
Avenger
25 / / 23.02.2007
Цитата: Green
Какой компилятор?
У меня все построилось (VC 8.0), хотя код конечно отвратительный.

Давай зарефакторим для начала.
1. Странно, что используя С++ ты используешь С-style строки, а не std::string.
2. Задавать размер массива, если ты его тут же инициализируешь, не обязательно.
3. Я бы рекомендовал давать более значимые имена, как переменным, так и методам и типам. И использовать какую-нибудь одну нотацию определения имен.
4. Массивы в С++ передаются только по ссылке или по указателю!
5. Совсем недавно обсуждали, как можно использовать информацию типа массив. Если функция принимает аргумент типа массив, то нет необходимости передавать размер этого массива отдельным аргументом.
6. В циклах так же можно воспользоваться инф. из самого типа массив.
7. Нет никакой необходимости употреблять слово struct в определении переменной.


Во первых СПАСИБО за ответ, а теперь перейдём к вопросам :)
1.Меня интересуэт пункт первий твоего ответа, если не трудно наведи ко който пример а то ты сказал что я использую С- стиль и я никак не пойму вчем моя ошыбка?.
2. Что косаетсо 4-го ответа, то разве я не указатель передаю, я вычетал что arr[] воспринимаетса также как и *arr тоисть вродь всьо верно или я не прав?

3
08 августа 2007 года
Green
4.8K / / 20.01.2000
Цитата: Avenger
Во первых СПАСИБО за ответ, а теперь перейдём к вопросам :)
1.Меня интересуэт пункт первий твоего ответа, если не трудно наведи ко който пример а то ты сказал что я использую С- стиль и я никак не пойму вчем моя ошыбка?.


 
Код:
struct debts
{
    char name[50];  <- это C-string вполне можно заменить на std::string
    double amount;
};



Цитата: Avenger

2. Что косаетсо 4-го ответа, то разве я не указатель передаю, я вычетал что arr[] воспринимаетса также как и *arr тоисть вродь всьо верно или я не прав?


Верно, но в данном случае вполне можно передать массив, а не указатель на первый элемент.

[color=red]P.S. И пожалуйста, пиши по-русски.[/color]

350
11 августа 2007 года
cheburator
589 / / 01.06.2006
Цитата: cheburator
Green:
5. Совсем недавно обсуждали, как можно использовать информацию типа массив. Если функция принимает аргумент типа массив, то нет необходимости передавать размер этого массива отдельным аргументом.
А дадите ссылку на это обсуждение?


Спасибо за приведенные ссылки.
Раньше думал, массив от указателя отличается лишь константностью (int var[5] === int * const var) и имеет различия лишь при инициализации. (Впрочем, такая дезинформация мне мало мешала :))
Теперь вижу, что действительно, информация о размере массива является частью типа массива, и эту информацию можно из типа извлечь и использовать. Поистине, очень удобно для статических массивов.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог