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