如何使基本模板 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",因此翻译可以在接近原始语言的日期发布。然后发送更新(你希望!),翻译者更新翻译版本。鉴于这里有人参与,可能会在此过程的某个阶段出现错误。
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",因此翻译可以在接近原始语言的日期发布。然后发送更新(你希望!),翻译者更新翻译版本。鉴于这里有人参与,可能会在此过程的某个阶段出现错误。