C++11 can';不要使用静态std::atomic(并且不知道如何初始化它)

C++11 can';不要使用静态std::atomic(并且不知道如何初始化它),c++11,atomic,C++11,Atomic,我有以下代码: #include <cstdlib> #include <cstdio> #include <atomic> enum ATYPE { Undefined = 0, typeA, typeB, typeC }; template<ATYPE TYPE = Undefined> struct Object { Object() { counter++; } static std::atomic<int>

我有以下代码:

#include <cstdlib>
#include <cstdio>
#include <atomic>

enum ATYPE { Undefined = 0, typeA, typeB, typeC };

template<ATYPE TYPE = Undefined>
struct Object
{
    Object() { counter++; }
    static std::atomic<int> counter;
};

//template<ATYPE TYPE>
//std::atomic<int> Object<TYPE>::counter = 0;

template<ATYPE TYPE>
void test()
{
    printf("in test\n");
    Object<TYPE> o;
}

int main(int argc, char **argv)
{
    test<typeA>();
    printf("%d\n", Object<typeA>::counter.load());
    return 0;
}
我得到了以下错误:

Undefined symbols for architecture x86_64:
"Object<(ATYPE)1>::counter", referenced from:
_main in testray-D4iTOH.o
Object<(ATYPE)1>::Object() in testray-D4iTOH.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
架构x86_64的未定义符号: “对象::计数器”,引用自: _testray-D4iTOH.o中的主管道 testray-D4iTOH.o中的Object::Object() ld:找不到架构x86_64的符号 叮当声:错误:链接器命令失败,退出代码为1(使用-v查看调用) 我不知道我想做的在技术上是否可行。正如代码希望显示的,我正在尝试创建原子类的静态实例(顺便说一句,我也不知道如何初始化这个变量。如何初始化静态std::atomic?)。我试图做的是计算运行程序时创建的类对象的实例数,针对每种可能的类型(typeA、B、C等)。 这就是我提出的机制,但也许(除了我想解决的问题之外,如果可能的话)有人可以建议一个更好的解决方案?非常感谢


非常感谢。

正如Dave在评论中指出的,静态变量需要在某个地方声明:

包括
#包括
#包括
枚举类型{Undefined=0,typeA,typeB,typeC};
模板
结构对象
{
对象(){counter++;}
静态std::原子计数器;
};
模板
std::原子对象::计数器(0);
模板
无效测试()
{
printf(“测试中”);
对象o;
}
int main(int argc,字符**argv)
{
test();
printf(“%d\n”,Object::counter.load());
返回0;
}

它编译得很好。

这与它的原子性无关。实际上,您没有在任何地方定义它,只是声明了它。您需要添加
std::atomic Object::counter某处(在main还没问题之前)看,然后再做演示。@Dave:是的,非常感谢。因为我找不到如何初始化它,我对代码进行了注释,它停止了编译。。。但是我如何初始化它呢?您基本上不需要对我发布的示例代码进行任何更改。Atomic的构造函数不需要参数。@Dave,谢谢,我在下面发布了代码供将来参考。
Undefined symbols for architecture x86_64:
"Object<(ATYPE)1>::counter", referenced from:
_main in testray-D4iTOH.o
Object<(ATYPE)1>::Object() in testray-D4iTOH.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
#include <cstdio>
#include <atomic>

enum ATYPE { Undefined = 0, typeA, typeB, typeC };

template<ATYPE TYPE = Undefined>
struct Object
{
    Object() { counter++; }
    static std::atomic<int> counter;
};

template<ATYPE TYPE>
std::atomic<int> Object<TYPE>::counter(0);

template<ATYPE TYPE>
void test()
{
    printf("in test\n");
    Object<TYPE> o;
}

int main(int argc, char **argv)
{
    test<typeA>();
    printf("%d\n", Object<typeA>::counter.load());
    return 0;
}