我正在学习奇怪的重复模板模式。这个模板有什么问题?

时间:2017-02-15 09:35:27

标签: c++ templates crtp

感谢this post,我正在努力学习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类型。

2 个答案:

答案 0 :(得分:2)

这个

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

应该看起来像

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

因为您在Evelope内定义了一个T类型的变量。

答案 1 :(得分:2)

当您撰写template <EnvelopeType T>时,这是一个模板,它采用非类型参数 T 类型 EnvelopeType。您收到&#34;未知类型&#34; 错误,因为在该上下文中没有名为EnvelopeType的类型。在您的代码中,EnvelopeType类型仅在template<class EnvelopeType> class Envelope的定义中显示为类型。

相反,你可能想写这个:

template <typename T>
double Envelope<T>::mValue;
相关问题