Rozważmy następujące klasy Szablon:C++ szablon z „const”
template <typename T> class Function {
public:
virtual float eval(const T &x, const T &y) = 0;
};
ponieważ funkcja „eval” nie powinien zmienić wartość z dwóch wejść „x” i „y”, kładę je jako " const ". Potem utworzyć następujące klasy pochodzący z funkcją
class Foo1 : public Function <float*> {
public:
Foo1() : Function <float*>() {}
virtual float eval(const float* &x, const float* &y) { ... }
};
Kiedy skompilować z g ++, pojawia się następujące ostrzeżenie:
hidden overloaded virtual function 'Function<float *>::eval' declared here: type mismatch at 1st parameter
('float *const &' vs 'const float *&')
virtual float eval(const T &x, const T &y) = 0;
I nie mogę instancję klasy foo1. Kompilator mówi, że funkcja "eval" nie jest zaimplementowana. Aby kompilator szczęśliwy, klasa pochodzić musi być następująca:
class Foo2 : public Function <float*> {
public:
Foo2() : Function <float*>() {}
virtual float eval(float* const &x, float* const &y) { ... }
};
funkcja foo2 :: eval wykorzystuje dwa parametry typu „pływaka * const” zamiast „const pływaka *”. Innymi słowy, Foo2 :: eval może modyfikować zawartość tablic "x" i "y". Nie tego chcę.
Próbowałem zmienić szablon klasy „funkcja” w następujący sposób:
virtual float eval(T const &x, T const &y) = 0;
Ale klasa foo1 nadal nie działa, klasa foo2 działa podobnie jak w poprzednim przypadku.
- Wygląda więc na to, że albo 'const T & x' lub 'T const & x' w klasie szablonu zakłada 'pływaka * const & x' w klasie pochodnej. Czy to jest poprawne?
- Jeśli chcę "const float * & x '(lub" flo float * x') w klasie pochodnej, jaka powinna być moja klasa szablonu Funkcja?
Dziękuję.