0

在《Effective C++》第44条:Factor parameter-independent code out of templates。我发现它的英文版和侯捷翻译的中文版有些不同。

这是我在第 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)instead of的原因invert(n):模板化基类的函数名会隐藏在派生类中。
我认为这可能是错误的,因为using SquareMatrixBase<T>::invert;已经在派生类的其他部分添加了。

但我想,侯捷作为一个著名的翻译家,不会轻易犯这么明显的错误,这次他真的错了吗?

4

1 回答 1

2

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

编辑:由于这是一个模板类,您需要using声明或this->invert(n)明确invert使用哪个。这是因为也可能有一个invert带参数的全局变量,编译器无法真正知道您希望使用哪个。

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

于 2016-04-04T07:33:56.810 回答