我正在使用Stroustrup的包装器模板类:
template<class T, class Pref, class Suf>
class Wrap {
protected:
T* p;
int* owned;
void incr_owned() { if (owned) ++*owned; }
void decr_owned() { if (owned && --*owned == 0) { delete p; delete owned; } }
Pref prefix;
Suf suffix;
public:
Wrap(T& x, Pref pr, Suf su)
:p(&x), owned(0), prefix(pr), suffix(su) { }
Wrap(T* pp, Pref pr, Suf su)
:p(pp), owned(new int(1)), prefix(pr), suffix(su) { }
Wrap(const Wrap& a)
:p(a.p), owned(a.owned), prefix(a.prefix), suffix(a.suffix)
{ incr_owned(); }
我将它子类化为创建线程安全对象:
template<class DSP> class DspWrap : public Wrap<DSP, void(*)(), void(*)()> {
protected:
CriticalSection* criticalSection;
public:
DspWrap(DSP& x) : Wrap<DSP, void(*)(), void(*)()>(x, &DspWrap::prefix, &DspWrap::suffix) {
}
DspWrap(DSP* pp) : Wrap<DSP, void(*)(), void(*)()>(pp, &DspWrap::prefix, &DspWrap::suffix) { //compiler error here
}
但是在创建对象DspWrap<PpmDsp> wrap = DspWrap<PpmDsp>(new PpmDsp());
的行中,我收到以下错误error C2664: 'Wrap<T,Pref,Suf>::Wrap(T &,Pref,Suf)' : cannot convert parameter 1 from 'PpmDsp *' to 'PpmDsp &'
但为什么调用错误的构造函数呢?实际上有PpmDsp*
的构造函数,为什么它会尝试调用PpmDsp&
?
提前致谢
答案 0 :(得分:0)
我不确定你正在尝试做什么关于将成员初始化为自己,但你需要适当的基类构造参数,基类成员< / em> *他们自己*不是这样做的方式。
一旦我为prefix
和suffix
声明了两个真正的函数,其余函数就会正常工作,基本构造函数会正确初始化。由于我没有CriticalSection
或DSP
的定义,我有点不得不伪造这个样本,但是....
#include <iostream>
typedef int CriticalSection;
template<class T, class Pref, class Suf>
class Wrap {
protected:
T* p;
int* owned;
void incr_owned() { if (owned) ++*owned; }
void decr_owned() { if (owned && --*owned == 0) { delete p; delete owned; } }
Pref prefix;
Suf suffix;
public:
Wrap(T& x, Pref pr, Suf su)
:p(&x), owned(0), prefix(pr), suffix(su) { }
Wrap(T* pp, Pref pr, Suf su)
:p(pp), owned(new int(1)), prefix(pr), suffix(su) { }
};
template<class DSP> class DspWrap : public Wrap<DSP, void(*)(), void(*)()> {
protected:
CriticalSection* criticalSection;
// implemenations of these
static void prefix_fn() {};
static void suffix_fn() {};
public:
DspWrap(DSP& x)
: Wrap<DSP, void(*)(), void(*)()>(x, &prefix_fn, &suffix_fn)
, criticalSection(new CriticalSection)
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
DspWrap(DSP* pp)
: Wrap<DSP, void(*)(), void(*)()>(pp, &prefix_fn, &suffix_fn)
, criticalSection(new CriticalSection)
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};
struct MyDSP { };
int main()
{
MyDSP dsp;
DspWrap<MyDSP> wrap1(dsp);
MyDSP *dsp2 = new MyDSP;
DspWrap<MyDSP> wrap2(dsp2);
return 0;
}
<强>输出强>
DspWrap<MyDSP>::DspWrap(DSP &) [DSP = MyDSP]
DspWrap<MyDSP>::DspWrap(DSP *) [DSP = MyDSP]
答案 1 :(得分:0)
&DspWrap::prefix
的类型为Pref*
。您将它传递给Wrap
的构造函数,该构造函数需要类型为Pref
的对象。相反,传递DspWrap::prefix
在语法上是正确的。
但是,DspWrap::prefix
在传递给Wrap
的构造函数时尚未初始化,因此之后实际调用Wrap::prefix
具有未定义的行为。