【发布时间】:2015-11-12 20:51:14
【问题描述】:
由于此环境中的 GNU 标准库实现,我正在努力解决 c++11 符号解析中似乎存在歧义的问题:
- Arch Linux 4.2.5-1 (x86_64)
- g++ 5.2.0
- clang++ 3.7.0
例子:
#include <iostream>
#include <string>
struct version {
unsigned major;
unsigned minor;
unsigned patch;
version(unsigned major, unsigned minor, unsigned patch) :
major(major), minor(minor), patch(patch) { }
friend std::ostream & operator<<(std::ostream & out, version const& v) {
out << v.major << ".";
out << v.minor << ".";
out << v.patch;
return out;
}
};
int main(int argc, char ** argv) {
version v(1, 1, 0);
std::cout << v << std::endl;
return 0;
}
编译器错误:
error: member initializer 'gnu_dev_major' does not name a non-static data
member or base class
error: member initializer 'gnu_dev_minor' does not name a non-static data
member or base class
命令:
clang++ -std=c++11 -o test *.cpp
范围解析运算符似乎不适用于成员初始化列表,因此我无法弄清楚如何解决歧义。此示例在没有 c++11 标志的情况下编译良好。
【问题讨论】:
-
它也可以在 MSVC 2015 中正常编译
-
@Myria 它们是 gcc 定义的宏
-
great 现在我必须将 gnu 添加到添加愚蠢的愚蠢宏定义的编译器列表中。首先当然是带有
min和max的Visual Studio,以及#define CreateFile CreateFileW之类的所有内容。 -
提交了一个 glibc 错误报告,它在我下面的答案中链接。