C++ - Zasłanianie nazw - ambiguates old declaration ??
- teka321
- Sędziwy Jeż
- Posty: 98
- Rejestracja: 02 maja 2010, 10:36
- Płeć: Mężczyzna
- Wersja Ubuntu: 12.04
- Środowisko graficzne: GNOME
- Architektura: x86
C++ - Zasłanianie nazw - ambiguates old declaration ??
Czy podany program powinien zadziałać czy powinien generować błędy jak to robi?
#include <iostream>
using namespace std;
float takasama(int tab, float ile);
int takasama(int tab, float ile);
int main()
{
int c;
float p;
p=takasama(5,6);
c=takasama(5,6);
cout << "Wyśwoietli float" <<" " << p << endl;
cout << "Wyśwoietli int" <<" " << c << endl;
return 0;
}
float takasama(int tab, float ile)
{
return ile;
}
int takasama(int tab, float ile)
{
return tab;
}
#include <iostream>
using namespace std;
float takasama(int tab, float ile);
int takasama(int tab, float ile);
int main()
{
int c;
float p;
p=takasama(5,6);
c=takasama(5,6);
cout << "Wyśwoietli float" <<" " << p << endl;
cout << "Wyśwoietli int" <<" " << c << endl;
return 0;
}
float takasama(int tab, float ile)
{
return ile;
}
int takasama(int tab, float ile)
{
return tab;
}
- beluosus
- Zakręcona Traszka
- Posty: 695
- Rejestracja: 01 paź 2006, 15:32
- Płeć: Mężczyzna
- Wersja Ubuntu: inny OS
- Środowisko graficzne: Xfce
- Architektura: x86
- Kontakt:
Re: C++ - Zasłanianie nazw - ambiguates old declaration ??
Jednoznaczność funkcji jest określana po nazwie i argumentach, a nie po typie zwracanym. Tutaj masz takie same listy argumentów, więc będzie błąd.
- teka321
- Sędziwy Jeż
- Posty: 98
- Rejestracja: 02 maja 2010, 10:36
- Płeć: Mężczyzna
- Wersja Ubuntu: 12.04
- Środowisko graficzne: GNOME
- Architektura: x86
Re: C++ - Zasłanianie nazw - ambiguates old declaration ??
Ok, dzięki za konkretną odpowiedz. Myślałem że kompilator domyśli się jaką funkcje ma wywołać po tym do jakiego typu zmiennej ma to zwrócić.
-
- Piegowaty Guziec
- Posty: 29
- Rejestracja: 03 lip 2008, 20:05
- Płeć: Mężczyzna
- Wersja Ubuntu: 12.04
- Środowisko graficzne: GNOME
- Architektura: x86
- Kontakt:
Re: C++ - Zasłanianie nazw - ambiguates old declaration ??
Chyba nie ma szans się domyślić, bo można przecież zawołać funkcję bez przypisywania wyniku gdziekolwiek
- teka321
- Sędziwy Jeż
- Posty: 98
- Rejestracja: 02 maja 2010, 10:36
- Płeć: Mężczyzna
- Wersja Ubuntu: 12.04
- Środowisko graficzne: GNOME
- Architektura: x86
Re: C++ - Zasłanianie nazw - ambiguates old declaration ??
Wiem, ale to jest głupota, za wyjątkiem gdy funkcja pracuje na wskaźnikach/referencji i robi coś z wartościami w swoim wnętrzu. A jeśli zwróci wynik to i tak zostanie zapisany nie wiadomo gdzie.. no to po co takie wywołanie, oprócz powodów które wcześniej wymieniłem?
-
- Przebojowy Jelonek
- Posty: 1113
- Rejestracja: 04 sty 2008, 20:58
- Płeć: Mężczyzna
- Wersja Ubuntu: inny OS
- Środowisko graficzne: Inne
- Architektura: x86_64
Re: C++ - Zasłanianie nazw - ambiguates old declaration ??
Ja bym problem rozwiązał tak:
Zwraca co trzeba, zależnie od sytuacji.
A na zadanie domowe możesz pomyśleć jak to działa
Kod: Zaznacz cały
#include <iostream>
using namespace std;
class Example{
private:
int a;
double b;
public:
Example & function (int arg1, double arg2){
this->a = arg1;
this->b = arg2;
return * this;
}
operator int() { return a; }
operator double() { return b; }
};
int main()
{
Example ex;
int a = ex.function(6,8.2);
double b = ex.function(6,8.2);
cout << a << "\t" << b << endl;
return 0;
}
A na zadanie domowe możesz pomyśleć jak to działa

- beluosus
- Zakręcona Traszka
- Posty: 695
- Rejestracja: 01 paź 2006, 15:32
- Płeć: Mężczyzna
- Wersja Ubuntu: inny OS
- Środowisko graficzne: Xfce
- Architektura: x86
- Kontakt:
Re: C++ - Zasłanianie nazw - ambiguates old declaration ??
Dajmy na to, że masz funkcję pow:
I teraz masz kod:
W tym momencie każda funkcja jest odpowiednia - nie ma bardziej odpowiedniej lub mniej odpowiedniej funkcji w tym wypadku (jeśli chodzi o typ zwracany), bo nastąpi niejawne rzutowanie. Kolejny kod:
Teraz kompilator w trakcie kompilacji ma jakieś informacje co do typu argumentu i może je odpowiednio wykorzystać (zwróć uwagę, że 'A' ma taką samą wartość - 65 - jak pozostałe przykłady). W poprzednim przypadku wartość zwracana jest obliczana w czasie wykonywania programu, więc kompilator nie wie czy zostanie zwrócona wartość 65 (potraktuje jako int), czy 65.5 (potraktuje jako double), czy 65.0 (niby to samo co 65, ale inny zapis binarny ze wzlgędu na typ). Funkcja po prostu zwraca określoną wartość o długości słowa (32 bity dla IA-32 (czy też raczej dwusłowa jak to się przyjęło z x86)). Czy jest to wskaźnik, liczba całkowita czy zmiennoprzecinkowa zależy już tylko od tego jak Twój program ją zinterpretuje. To są metadane, które nie są zapisywane w pliku wykonywalnym - one są tylko dla kompilatora.
Oczywiście można by stosować zapis (lub różnych trików, np takich jak post wyżej, ale moim zdaniem jest to sztuką dla sztuki):
Ale najwidoczniej ludzie zajmujący się tworzeniem języka nie uznali tego za dobry pomysł.
Kod: Zaznacz cały
double pow ( double base, double exponent );
long double pow ( long double base, long double exponent );
float pow ( float base, float exponent );
double pow ( double base, int exponent );
long double pow ( long double base, int exponent );
Kod: Zaznacz cały
int i = pow(10, 3);
Kod: Zaznacz cały
#include <cstdio>
void f(float)
{
printf("float\n");
}
void f(double)
{
printf("double\n");
}
void f(int)
{
printf("int\n");
}
void f(char)
{
printf("char\n");
}
int main()
{
f(65.0f);
f(65.0);
f(65);
f('A');
return 0;
}
Oczywiście można by stosować zapis (lub różnych trików, np takich jak post wyżej, ale moim zdaniem jest to sztuką dla sztuki):
Kod: Zaznacz cały
(long double) pow(10, 3);
static_cast<long double> (pow(10, 3));
Wynik funkcji jest zwracany w rejestrze eax (chyba we wszystkich konwencjach wywoływania funkcji dla x86).teka321 pisze:A jeśli zwróci wynik to i tak zostanie zapisany nie wiadomo gdzie..
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 5 gości