Как сделать функции базового шаблона видимыми в производном классе?

В пункте «Эффективный 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

В китайской версии, переведенной Хоу Цзе (侯 捷). Предыдущие строки кода почти такие же, за исключением второй последней строки кода:

void invert() { this->invert(n); }

В китайской версии Хоу Цзе объясняет причину использования this->invert(n) вместо invert(n): имена функций шаблонизированных базовых классов будут скрыты в производных классах.
Я думаю, что это может быть неправильно, потому что using SquareMatrixBase<T>::invert; был добавлен в другую часть производного класса.

Но я думаю, как известный переводчик, Хоу Цзе не будет легко совершить такую ​​очевидную ошибку. Он действительно не прав в этот раз?

0

Решение

Оба из них эквивалентны. this->invert(n) а также invert(n) оба будут вызывать одну и ту же функцию базового класса. Я уверен только на 99%, но я не думаю, using SquareMatrixBase<T>::invert; будет иметь значение здесь, так как нет действительного invert это принимает аргумент в производном классе.

Редактировать: так как это класс ШАБЛОН, вам нужно using заявление или this->invert(n) чтобы выяснить, какие invert использовать. Это потому, что там также может быть глобальный invert это принимает аргумент, и компилятор не может точно знать, что вы хотите использовать.

Очевидно, что никто здесь не может сказать, ПОЧЕМУ это сделано таким образом — возможно, это перевод из более старой версии книги, где автор позднее обновил ее. Часто, когда переводы выполняются, переводчик получает «предварительную версию» окончательного документа, поэтому перевод может быть выпущен ближе к дате исходного языка. Затем обновления рассылаются (вы надеетесь!), И переводчик обновляет переведенную версию. Учитывая, что здесь участвуют люди, вполне возможно, что на каком-то этапе этого процесса появляются ошибки.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector