私は、部分的なテンプレートの特殊化を必要とする関数を実装しようとしており、静的構造体の手法に戻ってきましたが、多くの問題が発生しています。
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 番目: コンパイラは、現在のスコープ (クラス スコープ) でテンプレートを特殊化できないと文句を言います。
何が問題なのかわかりません。誤って不適切な構文を呼び出したことがありますか?