2016-04-04 4 views
0

В «Эффективном 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; был добавлен в другую часть производного класса.

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

ответ

2

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

Edit: Так как это шаблонный класс, вам нужно using заявление или this->invert(n) сделать ясно, какие invert использовать. Это связано с тем, что также может быть глобальный invert, который принимает аргумент, и компилятор не может действительно знать, что вы хотите использовать.

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

+0

Мы можем использовать 'using SquareMatrixBase :: инвертировать;' или 'this-> инвертировать (n)'. Но я думаю, что нет необходимости использовать оба. –

+0

Я думал, что этого достаточно, чтобы иметь разные аргументы? –

+0

В Meyers's «Эффективный C++», пункт 43, Он предлагает нам 3 способа использования функций в шаблонных базовых классах. Один из них использует 'this'. Другое добавляет' using Base :: function_name'. @ BeyelerStudios –

Смежные вопросы