没有法律转换为'this'指针

时间:2010-11-30 19:44:24

标签: c++ templates

请查看此代码并运行它:
我得到了很奇怪的错误:
错误1错误C2663:'Allocator :: allocate_help':2个重载没有'this'指针的合法转换

template<class FailureSignal>
class Allocator
{
private:
    template<class Exception,class Argument>
    void allocate_help(const Argument& arg,Int2Type<true>)
    {
    }

    template<class Exception,class Argument>
    std::nullptr_t allocate_help(const Argument& arg,Int2Type<false>)
    {
        return nullptr;
    }

public:
    template<class T>
    void Allocate(signed long int nObjects,T** ptr = 0)const
    {
    allocate_help<std::bad_alloc>(1,Int2Type<true>());  
    }

};

int _tmain(int argc, _TCHAR* argv[])
{
    Allocator<int> all;
    all.Allocate<int>(1);
    return 0;
}  

我绝对不明白这个错误的消息。希望有人可以帮助我。谢谢。

3 个答案:

答案 0 :(得分:12)

我注意到Allocate已声明为constallocate_help未声明 - 可能与此问题有关吗?

答案 1 :(得分:1)

我遇到了同样的错误,这个错误也是由const引起的,但方式有点不同。

我有两个虚函数(重载),一个是const而另一个不是。这导致了这个问题。如果你想重载一个函数,它们都需要匹配,如果它们是const的话。

virtual void value() const = 0;
virtual void value(MyStruct & struct) = 0;

上面的代码会导致此错误。解决方法是将第二个声明更改为:

virtual void value(MyStruct & struct) const = 0;

答案 2 :(得分:0)

当我尝试在const声明的方法中更改成员数据时,我遇到了这个问题。

众所周知,const方法应该不更改成员数据。 编译器gcc / clang不会返回正确的错误消息。

删除const指定符后,它已成功编译
void I_am_a_const_method_but_trying_to_modify_member() const{
        amap.emplace(std::make_tuple(1, 1, "a"), 1);
    }

compiler explorer link