template<typename tVector>
inline const tVector& DaubechiesWavelet<tVector, 1>::scalingCoeff() {
return tVector({ 1, 1 });
}
This is the definition of a member of a partial specialization, which will be defined as follows
template<typename tVector>
class DaubechiesWavelet<tVector, 1> {
const tVector& scalingCoeff();
};
This is not a specialization of the scalingCoeff member of the main DaubechiesWavelet template. This specialization is required to pass the value of all arguments that your specialization does not. You can use overload to do what you want, though
template<typename tVector, int A>
class DaubechiesWavelet : public AbstractWavelet<tVector> {
template<typename T, int I> struct Params { };
public:
static inline const tVector waveletCoeff() {
tVector result( 2*A );
tVector sc = scalingCoeff();
for(int i = 0; i < 2*A; ++i) {
result(i) = pow(-1, i) * sc(2*A - 1 - i);
}
return result;
}
static inline const tVector& scalingCoeff() {
return scalingCoeffImpl(Params<tVector, A>());
}
private:
template<typename tVector1, int A1>
static inline const tVector& scalingCoeffImpl(Params<tVector1, A1>) {
}
template<typename tVector1>
static inline const tVector& scalingCoeffImpl(Params<tVector1, 1>) {
return tVector({ 1, 1 });
}
};
, , , ++ 0x.