不能使用静态std :: atomic(并且不知道如何初始化它)

时间:2013-08-11 19:41:51

标签: 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> 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;
}

当我使用以下命令行编译它时:

clang++ -o test -std=c++11 -stdlib=libc++ test.cpp

我收到以下错误:

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)

我不知道我想要做的事情在技术上是否可行。正如代码希望显示的那样,我正在尝试创建一个原子类的静态实例(BTW,我也不知道如何初始化这个变量。你如何初始化 static std :: atomic&lt; &GT ;?)。我想要做的是计算在运行程序时为每种可能的类型(typeA,B,C等)创建的Object类的实例数。 这是我提出的机制,但也许(除了我想要解决的问题,如果可能的话)有人可以建议更好的解决方案吗?非常感谢。

非常感谢你。

1 个答案:

答案 0 :(得分:0)

正如Dave在评论中指出的那样,静态变量需要在某处声明:

包括

#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;
}

它汇编得很好。