我正在学习 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;
感谢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;