後者の BBB や func をどう実用的に使いうるのか微妙に疑問が残るところだけど
まあ単純に技術的解説に絞ってみよう
後者でダメと書かれているほうの func は「非メンバー関数」なのだが、そこは理解できているかい?
どれかのクラスに属しているわけではない関数 main とか printf とかと同じ扱いなわけだ。
struct foo {
int func(); // これは foo::func
};
int func(); // これは非メンバ func
提示コード後者は、こういう状況になっているわけだ。この2つの func は無関係な独立した存在。
つーことで、やりたいことがメンバー関数 func の定義を、クラス定義外で行うことであるとするなら
書き方の方針はこういうことになる
1.メンバー関数 func は AAA のメンバーである → AAA::func と書かなきゃならない
2.AAA は実は template であるため AAA<T> と書かなきゃならない
3.func の返却値の型は BBB なんだが、これは AAA の型だから AAA<T>::BBB と書く必要がある
と、この順に考え+実装していくことになる
1.の時点で *** AAA::func() { ... } と書ける。
この時点で返却値の型はまだ考えていないので *** と適当にごまかしておく
2.を適用して *** AAA<T>::func() { ... } と修正
3.を適用して AAA<T>::BBB AAA<T>::func() { ... } となる
4.全体を template 化して
template<typename T> AAA<T>::BBB AAA<T>::func() { ... } で完了。
|