我有以下代码:
#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)
我不知道我正在尝试做的事情在技术上是否可行。正如代码希望显示的那样,我正在尝试创建原子类的静态实例(顺便说一句,我也不知道如何初始化这个变量。你如何初始化静态std::atomic<>?)。我想要做的是计算运行程序时创建的类 Object 的实例数,对于每种可能的类型(typeA、B、C 等)。这就是我想出的机制,但也许(除了我想解决的问题之外)有人可以提出更好的解决方案吗?将不胜感激。
太感谢了。