感谢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
类型。
答案 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;