Рассмотрим следующий класс шаблона:C шаблон ++ с «сопзЬ»
template <typename T> class Function {
public:
virtual float eval(const T &x, const T &y) = 0;
};
Поскольку функция «Eval» не следует изменять значение «х» два входа и «у», я их как " Уст. Затем я создаю следующий класс, производный от функции
class Foo1 : public Function <float*> {
public:
Foo1() : Function <float*>() {}
virtual float eval(const float* &x, const float* &y) { ... }
};
Когда я компилирую с г ++, я получаю следующее предупреждение:
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;
И я не могу создать экземпляр класса Foo1. Компилятор говорит, что функция eval не реализована. Для того, чтобы компилятор счастливым, производный класс должен выглядеть следующим образом:
class Foo2 : public Function <float*> {
public:
Foo2() : Function <float*>() {}
virtual float eval(float* const &x, float* const &y) { ... }
};
функция Foo2 :: Eval использует два параметра типа «флоат * сопзЬ» вместо «сопзЬ флоат *». Другими словами, Foo2 :: eval может изменять содержимое массивов «x» и «y». Это не то, что я хочу.
Я попытался изменить класс шаблона «Функция» следующим образом:
virtual float eval(T const &x, T const &y) = 0;
Но класс Foo1 все еще не работает, класс Foo2 работает как и в предыдущем случае.
- Таким образом, кажется, что либо «сопзЬ T & х» или «T Const & х» в классе шаблона означает «поплавок * сопзИ & х» в производном классе. Это верно?
- Если я хочу 'const float * & x' (или 'const float * x') в производном классе, каким должен быть класс шаблона Function?
спасибо.