c ++ Ошибка шаблона в основной функции? - PullRequest
0 голосов
/ 27 ноября 2011

Я использую 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'

Почему есть разница? ... и это может относиться к предыдущему сообщению ...

Если я добавлю определение в заголовок следующим образом, я получу:

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);
}

Ответы [ 3 ]

2 голосов
/ 28 ноября 2011

Если вы хотите, чтобы jMin была функцией-членом шаблона CVid3Dlg, вы должны поместить определение шаблона в класс CVid3Dlg.

class CVid3Dlg
{
     template <class T> T jMin( T a, T b ){  
      return ( a < b );// ? a : b;  
     }     
};
2 голосов
/ 28 ноября 2011

Ну, ошибка говорит вам точно, что не так:

'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. Если вы не объявили это так, вы получите эту ошибку.

0 голосов
/ 28 ноября 2011

ОК, вы сделали шаблон функцией-членом CVid3Dlg. Теперь в CVid3Dlg :: exTemplate () вы можете использовать его следующим образом:

 CVid3Dlg::exTemplate() 
 {
       double min = jMin<double>(3.0, 3.1);

 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...