首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Decltype Bug Gcc无法编译

Decltype Bug Gcc无法编译
EN

Stack Overflow用户
提问于 2018-08-31 12:42:43
回答 1查看 58关注 0票数 1

源代码https://github.com/kennywakeland/Decltype-Bug/blob/master/main.cpp

测试编译https://coliru.stacked-crooked.com/a/443f03625728f00e

这段代码使用宏测试setter和getter。我想传入变量名。decltype没有向HTestSet返回正确的类型。你知道为什么它没有返回正确的值类型吗?

编译器错误g++ -std=c++11 -O2 -Wall -pedantic -pthread main.cpp && ./a.out

代码语言:javascript
复制
main.cpp: In function 'int main()':
main.cpp:26:72: error: no matching function for call to 'HTestSet(TestClass&, void (BaseClass::*)(int), int&)'
     if(HTestSet(OBGEC_ON, &decltype(OBGEC_ON)::SET_CALL, test_vall_stor)){
                                                                        ^

main.cpp:18:1: note: in expansion of macro 'H_TEST_VALUE_GET_SET'
 H_TEST_VALUE_GET_SET(H_GET_VALUE(OBGEC_ON, VAL_NAME), \
 ^~~~~~~~~~~~~~~~~~~~

main.cpp:92:5: note: in expansion of macro 'H_TEST_VALUE'
     H_TEST_VALUE(woo, Green, 3);
     ^~~~~~~~~~~~
EN

回答 1

Stack Overflow用户

发布于 2018-08-31 17:41:57

这不是一个bug (据我所知),也与decltype无关。问题是setGreenBaseClass的一个非虚拟成员函数,由于您没有在TestClass中重新声明这样的函数,因此:

代码语言:javascript
复制
&TestClass::setGreen

是:

代码语言:javascript
复制
void (BaseClass::*)(int)

...and因此,在HTestSet的模板实例化中有一个模板参数冲突。

我找不到比[expr.unary.op#3]中的示例更好的标准引用了

一元&运算符的结果是指向其操作数的指针。操作数应为左值或限定id。如果操作数是一个限定id,用于命名类型为T的某个类C的非静态或可变成员m,则结果的类型为“指向类型为T的类C的成员的指针”,并且是一个指定为C​::​m的prvalue。..。

结构A{ int i;};结构B:A{ };... &B::i ... //类型为int A​::​*

只有在main开头使用f才有效,因为在本例中,void (BaseClass::*)(int)可以隐式转换为void (TestClass::*)(int),在本例中为[conv.mem#2]

“指向类型cv T的B的成员的指针”类型的prvalue,其中B是类类型,可以转换为“指向类型cv T的D的成员的指针”类型的prvalue,其中D是B的派生类(class.derived)。由于结果的类型是“指向类型为cv T的D的成员的指针”,因此通过它间接使用D对象是有效的。结果与使用D的B子对象通过指针间接指向B的成员一样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52108544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档