In" Effective 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 :(得分:2)
这两者都是等价的。 this->invert(n)
和invert(n)
都将调用相同的基类函数。 我只有99%肯定,但我认为 < / p>
using SquareMatrixBase<T>::invert;
在这里不重要,因为没有有效的invert
在派生类中接受参数。
编辑:由于这是一个TEMPLATED类,因此您需要使用using
语句或this->invert(n)
来明确使用invert
。这是因为可能还有一个全局invert
接受一个参数,编译器无法真正知道你想要使用哪个。
显然,这里的任何人都不可能说出为什么这样做 - 可能是翻译来自本书的旧版本,后来作者已对此进行了更新。翻译完成后,翻译人员通常会获得最终文档的“预览版本”,因此翻译可以在原始语言日期附近发布。然后发送更新(您希望!),并且翻译人员更新翻译版本。鉴于此处涉及人类,在此过程的某个阶段可能会出现错误。