2016-04-04 10 views
0

"効果的なC++"の項目44: テンプレートのうち、パラメータに依存しない要因コード。Hou Jie(侯捷)によって翻訳された英語版と中国語版との間にいくつかの違いがあります。派生クラスで基本テンプレートクラス関数を表示するにはどうすればよいですか?

これは私がページ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;が派生クラスの他の部分に追加されているので、これは間違っていると思います。

しかし、私は有名な翻訳家として、侯傑はこのような明白な間違いを簡単にはしません。今回は本当に間違っていますか?

答えて

2

どちらも同等です。 this->invert(n)invert(n)は、どちらも同じ基本クラス関数を呼び出します。 派生クラスで引数を取る有効な invertが存在しないので、私は99%確実だと確信していますが、 using SquareMatrixBase<T>::invert;はここで重要とは思われません。

編集:これはテンプレートクラスがあるので、あなたが使用するinvertに明らかにすることをusing文またはthis->invert(n)を必要としています。これは、引数をとるグローバルinvertが存在する可能性があり、コンパイラはどちらを使用するかを本当に知ることができないためです。

ここに誰もがこのようにしているのかどうかは言うまでもありません。この翻訳は、著者の後に更新された古いバージョンの本からのものかもしれません。翻訳が完了すると、翻訳者は最終的な文書の「プレビュー版」を取得するので、元の言語の日付近くに翻訳を公開することができます。その後、更新が送信されます(あなたが望みます!)、翻訳者は翻訳されたバージョンを更新します。ここに人間が関わっていることを考えれば、このプロセスのいくつかの段階で間違いが起こる可能性があります。

+0

'SquareMatrixBase :: invert;や' this-> invert(n) 'を使うことができます。しかし、両方を使う必要はないと思います。 –

+0

私はそれが異なった議論をするのに十分だったと思いましたか? –

+0

あなたは確かですか?Meyersの「Effective C++」の項目43では、テンプレートベースのクラスで関数を使用する3つの方法を提供しています。そのうちの1人が 'this'を使用しています。 –

関連する問題