В «Эффективном C++» Пункт 44: Код, зависящий от фактора, из шаблонов . Я нахожу разницу между его английской версией и китайской версией, переведенной Хоу Цзе (侯 捷).Как сделать функции класса базового шаблона видимыми в производном классе?
Это английская версия я нашел в странице 214:
template<typename T> // size-independent base class for
class SquareMatrixBase { // square matrices
protected:
...
void invert(std::size_t matrixSize); // invert matrix of the given size
...
};
template<typename T, std::size_t n>
class SquareMatrix: private SquareMatrixBase<T> {
private:
using SquareMatrixBase<T>::invert; // make base class version of invert
// visible in this class; see Items 33
// and 43
public:
...
void invert() { invert(n); } // make inline call to base class
}; // version of invert
В своей китайской версии переведены Хоу Цзе (侯 捷) .The предыдущие строки кода являются почти то же самое, за исключением второй последней строки код:
void invert() { this->invert(n); }
в китайской версии, Хоу Цзе объясняет причину использования this->invert(n)
вместо invert(n)
: функциональных имен Шаблонных базовых классов будут скрыты в производных классов.
Я думаю, что это может быть неправильно, потому что using SquareMatrixBase<T>::invert;
был добавлен в другую часть производного класса.
Но я думаю, что известный переводчик, Хоу Цзе не будет легко совершать такую очевидную ошибку. Неужели он действительно ошибается на этот раз?
Мы можем использовать 'using SquareMatrixBase :: инвертировать;' или 'this-> инвертировать (n)'. Но я думаю, что нет необходимости использовать оба. –
Я думал, что этого достаточно, чтобы иметь разные аргументы? –
В Meyers's «Эффективный C++», пункт 43, Он предлагает нам 3 способа использования функций в шаблонных базовых классах. Один из них использует 'this'. Другое добавляет' using Base :: function_name'. @ BeyelerStudios –