如何使派生类中的基本模板类函数可见?

时间:2016-04-04 07:18:20

标签: c++ templates effective-c++

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;已添加到派生类的其他部分。

但我认为作为一名着名的翻译家,侯杰很容易犯下如此明显的错误。这次他真的错了吗?

1 个答案:

答案 0 :(得分:2)

这两者都是等价的。 this->invert(n)invert(n)都将调用相同的基类函数。 我只有99%肯定,但我认为using SquareMatrixBase<T>::invert;在这里不重要,因为没有有效的invert在派生类中接受参数。 < / p>

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

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