3

次のように、メンバー関数 moment() のみ (穴クラスではない) を特殊化しようとしています。

template<class Derived, class T>
class AbstractWavelet {
public:
  [...]

  template<bool useCache>
  const typename T::scalar moment(const int i, const int j) const {
    return abstractWaveletSpecialization<Derived, T, useCache>::moment(static_cast<const Derived*>(this), i, j);
  }
  template<bool useCache>
  friend const typename T::scalar abstractWaveletSpecialization<Derived, T, useCache>::moment(const Derived* const that, const int i, const int j);

protected:
  // returns the jth moment of the ith scaling function
  template<bool useCache>
  inline const typename T::scalar momentImpl(const int j, const int i) const {
    [...]
  } // momentImpl
};

実際の特殊化は、追加の abstractWaveletSpecialization 構造体で行われます。

template<class Derived, class T, bool useCache>
struct abstractWaveletSpecialization {
  inline static const typename T::scalar moment(const Derived* const that, const int i, const int j) {
    return that->momentImpl<useCache>(i,j);
  }
};


template<class Derived, class T> 
struct abstractWaveletSpecialization<Derived, T, true> {

  typedef const std::pair<const int, const int> momentCacheKey;
  typedef std::map<momentCacheKey,
               const typename T::scalar> momentCacheType;
  static momentCacheType momentCache;


  inline static const typename T::scalar moment(const Derived* const that, const int i, const int j) {
    momentCacheKey cacheKey(i,j);
    typename momentCacheType::iterator idx = momentCache.find(cacheKey);

    if (idx == momentCache.end())
      return that->momentImpl<true>(i, j);  // COMPILE ERROR HERE
    else
      return momentCache[cacheKey];
  }
};

問題は、特殊化された abstractWaveletSpecialization 構造体で momentImpl() を呼び出せないことです。

error: invalid operands of types ‘&lt;unresolved overloaded function type>’ and ‘bool’ to binary ‘operator<’

しかし、特殊化されていない abstractWaveletSpecialization 構造体での momentImpl の呼び出しについて、コンパイラは文句を言いません。

私のアプローチは C++ で禁止されていますか? または、これを機能させる方法はありますか?

4

1 に答える 1

2

試していただけますthat->template momentImpl<true>(i, j);か?これは、コンパイラに「ねえ、-> の後のことはテンプレート化された呼び出しです」と伝える方法です。

于 2010-07-26T09:31:44.320 に答える