Visual C++错误C2665:3个重载都无法转换所有参数类型

Visual C++ error C2665: none of the 3 overloads could convert all the argument types

本文关键字:转换 类型 参数 错误 C++ C2665 重载 3个 Visual      更新时间:2023-10-16

结构中的重载函数:

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个重载都无法转换所有参数类型。我该如何解决此问题?这件事我已经想了好几个小时了。

VARIABLE::VARIABLE(...)的唯一重载接受3个参数,即LPCTSTR、泛型类型U和另一个LPCTSTR。那么FADDCLASS(...)为什么要取3个泛型呢?用LPCTSTR代替TV