2014-09-05 35 views
-2

重載函數的結構:的Visual C++錯誤C2665:沒有3個重載可以轉換所有的參數類型

struct VARIABLE 
{ 
    VARIABLE() : ShortName(NULL), MemberAddr(0), Description(NULL), DefaultValue(NULL), ValueSize(0), MemberType(NULL) {} 


    template<typename U> 
    VARIABLE(LPCTSTR sName, U const & member, U const & default, LPCTSTR desc) 
     : ShortName(sName), Description(desc) 
     , MemberAddr((LPCBYTE)&member - (LPCBYTE)0), MemberType(new VTYPE<U>()) 
     , SizeAddr(0), SizeType(NULL) 
    { 
     SetDefault(default); 
    } 


    template<typename U> 
    VARIABLE(LPCTSTR sName, U const & member, LPCTSTR desc) 
     : ShortName(sName), Description(desc) 
     , MemberAddr((LPCBYTE)&member - (LPCBYTE)0), MemberType(new VTYPE<U>()) 
     , SizeAddr(0), SizeType(NULL) 
    {} 

    template<typename T, typename U> 
    VARIABLE(LPCTSTR sName, NWArray<U> const & member, T const & size, LPCTSTR desc) 
     : ShortName(sName), Description(desc) 
     , MemberAddr((LPCBYTE)&member - (LPCBYTE)0), MemberType(new VTYPE<NWArray<U> >()) 
     , SizeAddr((LPCBYTE)&size - (LPCBYTE)0), SizeType(new VTYPE<T>()) 
    {} 

    ~VARIABLE() { 
     if (ValueSize && DefaultValue) { 
      delete DefaultValue; DefaultValue = NULL; ValueSize = 0; 
     } 
     if (MemberType) { 
      delete MemberType; MemberType = NULL; 
     } 
    } 

    template<typename U> void SetDefault(U default) { ValueSize = sizeof(U); DefaultValue = new U(default); } 
    template <typename U> const U& GetDefault() const { return *(U*)DefaultValue; } 

    LPCTSTR ShortName; 
    intptr_t MemberAddr; 
    TYPE *MemberType; 
    LPCTSTR Description; 
    LPVOID DefaultValue; 
    DWORD ValueSize; 
    DWORD SizeAddr; 
    TYPE *SizeType; 
}; 

#define INITVARTYPE(T) \ 
    T() { ::Init(this->GetInfDefmap(), (LPVOID)this); } \ 

#define BEGIN_INI_MAP_NOINIT(T) \ 
    LPCSTR GetTypeName() const { return #T; } \ 
    void *GetMember(const VARIABLE* memptr) const { return (void*)(((char*)this) + memptr->MemberAddr); } \ 
    const VARIABLE* GetInfDefmap() const { return InternalGetInfDefmap(); } \ 
    static VARIABLE* InternalGetInfDefmap() { \ 
    const T* pThis = 0; static VARIABLE map[] = { \ 

#define BEGIN_INI_MAP(T) \ 
    INITVARTYPE(T) \ 
    BEGIN_INI_MAP_NOINIT(T) \ 

#define END_INI_MAP() \ 
    VARIABLE() };\ 
    return map;} \ 

template<typename T, typename U, typename V> 
VARIABLE FADDCLASS(T member, U ptr, V desc) 
{ 
    VARIABLE(member, ptr, desc); 
} 

#define ADDCLASS(member) \ 
    FADDCLASS(#member, pThis->member, #member), \ 

它給了我這個錯誤時,它試圖建立以下過程。

struct test 
{ 
     char * name; 

     BEGIN_INI_MAP(test) 
     ADDCLASS(name) 
     END_INI_MAP() 
} 

錯誤C2665:「VARIABLE :: VARIABLE」3重載中沒有一個可以轉換所有參數類型。 我該如何解決這個問題? 我已經對此感到困惑了幾個小時。

+1

你知道模板函數'FADDCLASS'被聲明爲返回'VARIABLE',但沒有'return'語句,對吧?這不是錯誤消息中的唯一文字。請在問題中發佈* entire *錯誤信息,並在問題中提供支持描述,並確保您的FADDCLASS副本/粘貼是準確的,因爲現在顯然不存在。 – WhozCraig 2014-09-05 16:33:46

+0

您是否正在構建一個Unicode版本?所有那些'LPCTSTR'參數將會期望指向寬字符串的指針,但'#member'會產生一個窄的字符串 - ''name'',而不是'L'name''或'_T(「name」)' – 2014-09-05 16:46:36

回答

0

VARIABLE::VARIABLE(...)需要3個參數的唯一重載需要LPCTSTR,通用類型U,另一個LPCTSTR。爲什麼FADDCLASS(...)需要3種仿製藥?是否需要LPCTSTR而不是TV

相關問題