我正在使用VS c ++ 6.0。我已经读过6.0模板有问题吗?
好的......如果我将声明留作:
template <class T> T jMin( T a, T b ){
return ( a < b );
}
该功能有效,但如下所示,我收到错误:
error C2039: 'jMin' : is not a member of 'CVid3Dlg'
为什么会有区别?......这可能与上一篇文章有关......
如果我将定义放在HEADER中如下,我得到:
error C2893: Failed to specialize function template 'T __thiscall CVid3Dlg::jMin(T,T)'
With the following template arguments:
'double'
// CVid3Dlg.h
class CVid3Dlg : public CDialog
{
public:
CVid3Dlg(CWnd* pParent = NULL); // standard constructor
template <typename T> T jMin( T a, T b );
protected:
HICON m_hIcon;
bool PreViewFlag;
BITMAP bm; //bitmap struct
CBitmap m_bmp; //bitmap object
CRect m_rectFrame; //capture frame inside main window
bool firstTime;
// Generated message map functions
//{{AFX_MSG(CVid3Dlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnTimer(UINT nIDEvent);
afx_msg void GetVideo();
afx_msg void OnClose();
afx_msg void testing();
afx_msg void Imaging();
afx_msg void exTemplate();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
// CVid3Dlg.cpp
template <class T> T CVid3Dlg::jMin( T a, T b ){// <-- FAILS
return ( a < b );
}
void CVid3Dlg::exTemplate()
{
Image *im = new Image();
int s=0;
s = jMin((double)3, (double)4);
CString s1;
s1.Format("%d", s);
MessageBox(s1);
}
答案 0 :(得分:2)
嗯,错误告诉你究竟出了什么问题:
'jMin' : is not a member of 'CVid3Dlg'
如果你写
template <class T> T CVid3Dlg::jMin( T a, T b ) { ... }
而不是
template <class T> T jMin( T a, T b ) { ... }
然后你说jMin
是CVid3Dlg
的成员函数。如果您没有这样宣布,那么您将收到该错误。
答案 1 :(得分:2)
如果希望jMin成为CVid3Dlg的模板成员函数,则必须将模板定义放在CVid3Dlg类中。
class CVid3Dlg
{
template <class T> T jMin( T a, T b ){
return ( a < b );// ? a : b;
}
};
答案 2 :(得分:0)
好的,你已经使模板成为CVid3Dlg的成员函数。现在在CVid3Dlg :: exTemplate()中,您可以按如下方式使用它:
CVid3Dlg::exTemplate()
{
double min = jMin<double>(3.0, 3.1);
}