Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 正在尝试创建CAS模板_C++_Templates_Compare And Swap - Fatal编程技术网

C++ 正在尝试创建CAS模板

C++ 正在尝试创建CAS模板,c++,templates,compare-and-swap,C++,Templates,Compare And Swap,目前我正忙于处理CAS操作和无锁/无等待算法,为了我自己的理智,我决定实现一个模板来为我处理所有的转换: VC6: 在VC6下,我得到以下错误: error C2782: 'T __cdecl CAS(volatile T *,T,T)' : template parameter 'T' is ambiguous could be 'int' or 'volatile int *' GCC提出了以下观点: error: no matching fun

目前我正忙于处理CAS操作和无锁/无等待算法,为了我自己的理智,我决定实现一个模板来为我处理所有的转换:

VC6:

在VC6下,我得到以下错误:

error C2782: 'T __cdecl CAS(volatile T *,T,T)' : template parameter 'T' is ambiguous
        could be 'int'
        or       'volatile int *'
GCC提出了以下观点:

error: no matching function for call to 'CAS(volatile int**, NULL, int*&)'

是否可以为CAS ops获取一个模板,该模板在目标不稳定时不会中断?或者我被宏卡住了?

如果我按如下方式调用CAS函数,则可以:

CAS<int*>( &p, NULL, pi );
    typedef int* pint_t;

volatile pint_t p;
int i = 2;
pint_t pi = &i;
CAS<pint_t>( &p, NULL, pi );
这提供了更多的线索,以了解到底出了什么问题

解决此问题的一种方法是引入typedef,如下所示:

CAS<int*>( &p, NULL, pi );
    typedef int* pint_t;

volatile pint_t p;
int i = 2;
pint_t pi = &i;
CAS<pint_t>( &p, NULL, pi );
typedef int*品脱;
挥发性品脱;
int i=2;
品脱皮=&i;
CAS(&p,NULL,pi);

静态断言
?您使用的是C++0x吗?@KennyTM:对于GCC构建,是的,在VC下,我有一个宏要映射到无效的数组索引。它没有标记为C++0x,因为我试图避免C++0x构造,除了那些可以用宏模拟的构造。
interloctedcompareexchange
interloctedcompareexchangepointer
。您不应该混合使用它们。@J-16 SDiZ:VC6没有
InterlocatedCompareExchange指针
,因此它的
InterlocatedCompareExchange
的定义是
InterlocatedCompareExchange指针
。然而,这确实在我的GCC代码中带来了一个(半)bug,应该是强制转换到
PVOID
…从技术上讲,
NULL
应该是
(void*)0
,但是将
NULL
转换到
int*
没有任何区别,GCC仍然会抛出:
错误:调用'CAS时没有匹配的函数(volatile int**,int*,int*&)“
@Necrolis:重新写下我的答案:)另一种正确定义指针的方法是
int*p
做了一些测试,效果很好,只有
p
需要为
pint\t
类型,这是一个棘手的问题,但是,由于它所做的工作比它所解决的要多,似乎我还是要使用宏:|
error C2664: 'CAS' : cannot convert parameter 1 from 'volatile int **' to 'int *volatile *'
    typedef int* pint_t;

volatile pint_t p;
int i = 2;
pint_t pi = &i;
CAS<pint_t>( &p, NULL, pi );