2011-12-20 21 views
3

これは、Visual Studio 2010のコンパイラ(それはmicrsoftのVisual Studio 2003のコンパイラで問題はないが)エラーC2259:インスタンス化することはできません抽象クラス

error C2259: 'user_param::UserParamB2<std::string>' : cannot instantiate abstract class due to following members: 
    'bool user_param::UserParamBase::readonly(bool)' : is abstract 
    c:\qc\qc_daq\src\hfgui3\userparambase.h(128) : see declaration of 'user_param::UserParamBase::readonly' 
    'bool user_param::UserParamBase::readonly(void)' : is abstract 
    c:\qc\qc_daq\src\hfgui3\userparambase.h(127) : see declaration of 'user_param::UserParamBase::readonly' 
    'SIZE user_param::UserParamBase::winSize(void)' : is abstract 
    c:\qc\qc_daq\src\hfgui3\userparambase.h(129) : see declaration of 'user_param::UserParamBase::winSize' 

私のソースコードは次のようにのように見えるとのエラーメッセージです:

class UserParamBase : public UserParamName 
{ 
    public: 
     virtual bool readonly() =0; 
     virtual bool readonly(bool bReadonly)=0; 
     virtual SIZE winSize()=0;  
     virtual bool get()=0; 
     virtual void create(CWnd* pParentWnd,const RECT& rect)=0; 
     virtual void close()=0; 
     virtual void update()=0; 
} 

... 
template <> 
class UserParam<string> : public UserParamB2<string> 
{ 
public: 
bool get() 
{ 
    AutoCritSec acsWnd(m_csWnd, true); 
    if(m_wnd.combobox && m_wnd.combobox->GetSafeHwnd()) { 
     CString text; 
     m_wnd.combobox->GetWindowText(text); 
     this->assign((LPCSTR) text); 
    } else if(m_wnd.wnd && m_wnd.wnd->GetSafeHwnd()) { 
     char* psz=NULL; 
     string s; 
     unsigned uSize = m_wnd.wnd->GetWindowTextLength()+1; 
     try { 
      psz=new char[uSize]; 
      m_wnd.wnd->GetWindowText(psz,uSize); 
      s.assign(psz); 
     } 
     catch(...) { 
      if(psz) delete [] psz; 
      throw; 
     } 
     if(psz) delete [] psz; 
     s.erase(std::remove(s.begin(),s.end(),'\r'),s.end()); 
     this->assign(s); 
    } 
    return true; 
} 

エラーメッセージがthis->assign(s);声明で発生します。

+0

抽象クラスをインスタンス化することはできません。コンパイラのエラーメッセージは間違っていません。あなたはそれを "修正"することはできません。 –

+0

クラスにインターフェイスを追加してこのエラーを引き起こすことができますので、非常に助けてください... – Deanna

答えて

4

あなたがコードを投稿していないので、フォーマットされていないコンパイラの出力だけなので、特定するのは難しいです。しかし、抽象メソッドreadonly(bool)winSize(void)を持つクラスのサブクラスを作成し、これらの関数をサブクラスで実装していないようです。したがって、あなたのサブクラスは抽象的なままでした。これらのメソッドを実装します。

+0

返信いただきありがとうございます。 – user1107855

+0

私はコードを投稿しています: – user1107855

+0

@Cody Grey:それをixにする方法を教えてください。このコードはMicrosoft Visual Studio 2003ではコンパイルされていますが、2010では正しくコンパイルされていません。 – user1107855

4

abstractクラスをインスタンス化することはできません。だれもあなたの手助けをすることはできません。

次のいずれかを実行できます

  • classを実装し、それはもはや抽象的になることはありません。

  • classから派生させて、子供にすべての抽象メソッドを実装させるようにしてください。これはあなたがやろうとしているようです。

抽象メソッドのようなものになります。あなたのケースでは

virtual void foo() = 0; 

を、方法UserParamBase::readonly(void)UserParamBase::winSize(void)は、基本クラスで抽象的です。

UserParamB2でオーバーライドして実装する必要があります。

+0

Greetings! 私の投稿に返信いただきありがとうございます! – user1107855

+0

しかし、私は正しいコードを理解することができません、少しお手伝いできますか?ここで私はコードを掲示しています。 – user1107855

+0

@ user1107855エラーメッセージは何ですか? –

関連する問題