1

私は、部分的なテンプレートの特殊化を必要とする関数を実装しようとしており、静的構造体の手法に戻ってきましたが、多くの問題が発生しています。

            template<typename T> struct PushImpl<const T&> {
                typedef T* result_type;
                typedef const T& argument_type;
                template<int StackSize> static result_type Push(IStack<StackSize>* sptr, argument_type ref) {
                // Code if the template is T&
                }
            };
            template<typename T> struct PushImpl<const T*> {
                typedef T* result_type;
                typedef const T* argument_type;
                template<int StackSize> static result_type Push(IStack<StackSize>* sptr, argument_type ptr) {
                    return PushImpl<const T&>::Push(sptr, *ptr);
                }
            };
            template<typename T> struct PushImpl {
                typedef T* result_type;
                typedef const T& argument_type;
                template<int StackSize> static result_type Push(IStack<StackSize>* sptr, argument_type ref) {
                // Code if the template is neither T* nor T&
                }
            };

            template<typename T> typename PushImpl<T>::result_type Push(typename PushImpl<T>::argument_type ref) {
                return PushImpl<T>::Push(this, ref);
            }

最初: 構造体は別のクラス (Push をメンバー func として提供するクラス) 内にネストされていますが、他のネストされたクラスはすべてアクセスできますが、テンプレート パラメーター (StackSize) にアクセスできません。私はそれを回避しましたが、通常のクラスのように StackSize にアクセスできればすっきりします。

2 番目: コンパイラは、T を使用していない、または T を推測できないと文句を言います。

3 番目: コンパイラは、現在のスコープ (クラス スコープ) でテンプレートを特殊化できないと文句を言います。

何が問題なのかわかりません。誤って不適切な構文を呼び出したことがありますか?

4

1 に答える 1

5

一般的なケースは特殊化の前に表示する必要があります。そうしないと、特殊化には特殊化するものが何もありません。

于 2010-06-17T22:05:28.463 に答える