C2131 C ++中static_assert()的错误

时间:2018-04-22 05:50:44

标签: c++ crtp

最近我试图创建一个只能有一个实例化对象的类。在搜索维基百科时,我发现使用单例模式会有所帮助。我不喜欢它的想法,并尝试做我自己的事情。这是它的代码。

#pragma once

#include <list>
#include <functional>

namespace GEvents
{
    struct mouseinfo
    {
    };
    template<typename T>
    struct Counter
    {
        Counter( )
        {
            static_assert( objects_created<2, "Multiple Instances Created" );
            objects_created++;
        }
        static int objects_created;
    };
    template<typename T> int  Counter<T>::objects_created(0);

    class MouseHandler:Counter<MouseHandler>
    {
        std::list<std::function<mouseinfo(void)>> hfunc;
    public:
        void Monitor( )
        {
        }
        void Stop( )
        {
        }
        void operator +=(std::function<mouseinfo(void)> func)
        {
            hfunc.push_back(func);
        }
        void inverseListing( )
        {
            hfunc.reverse( );
        }
        /*size_type & getFunctionCount( )
        {
            return hfunc.size( );
        }
*/


    };

}

在上面的代码中,我使用Curiously recurring template pattern来解决问题。我所做的是当我在编译时创建对象时,会有一个静态变量来计算这样创建的对象的数量。如果它小于1那么它不是问题,但是如果它超过1则 static_assert 变为false,从而导致打印消息Multiple Instances Created。但是,当我评估此表达式时,会出现以下错误:

Error   C2131:  expression did not evaluate to a constant

在static_assert存在的行。我可能误解了一些对象创建的概念。另外我认为静态对象在编译时没有初始化,但它们的空间只是保留。如果是这样的话,我怎样才能在编译时调用构造函数?

1 个答案:

答案 0 :(得分:1)

此处static_assert无法满足您的要求。请改用assert

{{1>} 中的条件必须static_assert,可承诺在编译时检查

但是,您的代码似乎必须在运行时进行检查,因此请尝试使用literal