【问题标题】:Visual C++ error C2665: none of the 3 overloads could convert all the argument typesVisual C++ 错误 C2665:3 个重载都不能转换所有参数类型
【发布时间】:2014-09-05 16:27:11
【问题描述】:

结构中的重载函数:

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 个重载都不能转换所有参数类型。 我该如何解决这个问题? 我已经为此困惑了几个小时。

【问题讨论】:

  • 您知道模板函数FADDCLASS 被声明为返回VARIABLE,但没有return 语句,对吧?这不是错误消息中的唯一文本。请在问题中发布带有支持描述的整个错误消息,并确保您复制/粘贴的FADDCLASS 准确无误,因为现在的内容显然不起作用。
  • 您是否正在构建 Unicode 版本?所有这些LPCTSTR 参数将期望指向宽字符串的指针,但#member 产生一个窄字符串文字 - "name",而不是L"name"_T("name")

标签: c++ visual-c++ operator-overloading


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 2022-09-28
    • 2014-04-16
    • 1970-01-01
    相关资源
    最近更新 更多