我正在学习 Curiously recurring 模板模式。这个模板有什么问题?

I'm learning the Curiously recurring template pattern. What's wrong with this template?

感谢this post, I'm trying to learning Curiously recurring template pattern

This是我写的代码:

#include <iostream>
#include <iomanip>
#include <vector>

using namespace std;

template<class EnvelopeType>
class Envelope
{
public:
    double mSingle = 1.0;

    void SetValue(double value) { mValue = value; }
    inline double GetValue() { return mValue; }

private:
    static double mValue;
};

class Volume : public Envelope<Volume>
{
};

class Pitch : public Envelope<Pitch>
{
};

template<EnvelopeType T>
double Envelope<T>::mValue;

int main()
{
    Envelope<Volume> mVolume;
    Envelope<Pitch> mPitch;

    mVolume.SetValue(0.5);
    mPitch.SetValue(1.0);
}

怎么了?它说 未知类型名称“EnvelopeType。它当然不知道:那是模板的 T 类型。

这个

template<EnvelopeType T>
double Envelope<T>::mValue;

实际上应该看起来像

template<typename T>
double Envelope<T>::mValue;

因为您在 Evelope 中定义了具有某些 T 类型的变量。

当你写 template <EnvelopeType T> 时,这是一个模板,它接受一个 non-type 参数 T EnvelopeType。您收到 "unknown type" 错误,因为在该上下文中没有名为 EnvelopeType 的类型。在您的代码中,类型 EnvelopeType 仅作为 template<class EnvelopeType> class Envelope.

定义中的类型可见

相反,您可能打算这样写:

template <typename T>
double Envelope<T>::mValue;