如何使基本模板 class 函数在派生 class 中可见?

How to make base template class functions visible in derived class?

In "Effective C++" Item 44:Factor 参数无关代码out of templates.I 找出侯捷翻译的英文版和中文版的区别。

这是我在第 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)的原因:模板化基classes的函数名将隐藏在派生classes.
我认为这可能是错误的,因为 using SquareMatrixBase<T>::invert; 已添加到派生的 class 的其他部分。

不过我觉得侯杰作为一个著名的翻译家,不会轻易说出这么明显的mistake.Is他这次真的错了吗?

这两个是等价的。 this->invert(n)invert(n) 都将调用相同的 base-class 函数。 我只有 99% 的把握,但我认为 using SquareMatrixBase<T>::invert; 在这里无关紧要,因为没有有效的 invert 在派生的 class 中接受参数.

编辑:由于这是模板 class,您需要 using 语句或 this->invert(n) 来明确使用哪个 invert。这是因为也可能有一个全局的 invert 接受一个参数,编译器无法真正知道你想使用哪个。

显然,这里的任何人都不可能说出为什么这样做 - 可能是翻译来自该书的旧版本,作者后来对此进行了更新。通常在翻译完成后,翻译人员会得到最终文档的 "preview version",因此翻译可以在接近原始语言的日期发布。然后发送更新(你希望!),翻译者更新翻译版本。鉴于这里有人参与,可能会在此过程的某个阶段出现错误。