在if语句中实例化模板类时出现的问题 首先,我是C++的NoOB,我迷路了。我在谷歌上搜索了几个小时,但我认为我的问题要么是利基,要么太简单了。下面是: >我正在编写一个C++ MeX文件,用于从Matlab中使用。但是,我希望允许单精度和双精度输入。所以我想使用模板来实现这一点
我上过这门课:在if语句中实例化模板类时出现的问题 首先,我是C++的NoOB,我迷路了。我在谷歌上搜索了几个小时,但我认为我的问题要么是利基,要么太简单了。下面是: >我正在编写一个C++ MeX文件,用于从Matlab中使用。但是,我希望允许单精度和双精度输入。所以我想使用模板来实现这一点,c++,matlab,templates,mex,C++,Matlab,Templates,Mex,我上过这门课: template< typename T > class img { T *_data; public: img (T *_data) : _data(_data) {} T &operator[]( int i ) { return _data[ i ]; } } 模板类img{ T*_数据; 公众: img(T*_数据):_数据(_数据){} T&运算符[](int i){return_data[i];} } 然后在main.c
template< typename T > class img {
T *_data;
public:
img (T *_data) : _data(_data) {}
T &operator[]( int i ) { return _data[ i ]; }
}
模板类img{
T*_数据;
公众:
img(T*_数据):_数据(_数据){}
T&运算符[](int i){return_data[i];}
}
然后在main.cpp中:
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
if (mxIsDouble(prhs[0])) {
double *f = (double *)mxGetPr( prhs[ 0 ] );
img<double> myimg(f);
} else if (mxIsSingle(prhs[0])) {
float *f = (float *)mxGetPr( prhs[ 0 ] );
img<float> myimg(f);
}
mexPrintf( "value of myimg[%d] = %f\n", 10, myimg[10] );
}
void-mexFunction(int-nlhs,mxArray*plhs[],
整数nrhs,常量mxArray*prhs[]
{
if(mxIsDouble(prhs[0])){
double*f=(double*)mxGetPr(prhs[0]);
img-myimg(f);
}else if(mxisingle(prhs[0])){
float*f=(float*)mxGetPr(prhs[0]);
img-myimg(f);
}
mexPrintf(“myimg[%d]的值=%f\n”,10,myimg[10]);
}
现在编译器抱怨“错误:使用了未声明的标识符myimg”
我认为这是因为对象
myimg
仅存在于if
范围内,对吗
如果我定义img myimg(f)在if
语句之前的code>有效,但显然只适用于双打
帮助
另外,我发现了这个相关的堆栈问题:“我认为这是因为对象myimg
仅存在于if
范围内,对吗?”-对。您必须编写一个额外的模板方法来完成所有需要做的事情。然后,您的if
语句将实例化模板,并在if
和else
两种情况下调用其方法,从而执行相应类型的代码。或者,通过大量工作,使模板从非模板基类继承,然后实现一些原语。这打开了使用动态分配对象的可能性。谢谢@SamVarshavchick,这很有帮助。我想我想避免使用额外的模板方法,但我现在已经实现了它,并且工作得非常好。这个问题真的应该被否决吗?我不认为它应该被否决,在我看来,这是一个体面的问题。