使用简单的用户定义文字进行编译失败

时间:2014-04-29 13:07:32

标签: c++ c++11 g++ iostream

我看到一些我无法解释的行为。考虑test.cpp

#include <iostream>
long double operator"" _N(long double a) { return a; }

int main(int argc, char** argv) {
    long double t = 4.0_N;
}

颁发

g++ -std=c++11 test.cpp

给了我

test.cpp:2:22: error: expected suffix identifier
long double operator"" _N(long double V) { return V; }
                    ^

进行以下任何更改都会给出错误:

// #include <iostream>  // Is there some conflict with something in iostream then?
long double operator"" _N(long double a) { return a; }    
...

#include <iostream>
long double operator"" _P(long double a) { return a; } 
// (or most other letters and/or words) 
...

然而,问题仍然存在至少_B_C(我没有测试整个字母表)...

我在这里缺少什么?

更多信息:

$ g++ --version 
g++ (GCC) 4.8.2

在64位Windows 7 SP1上运行CygWin。

1 个答案:

答案 0 :(得分:2)

使用您发布的预处理输出(http://pastebin.com/USSiRcGQ),我们可以立即看到问题:

long double operator "" 04(long double V) { return V; }

所以你有一些头文件(相当于):

#define _N 04

知道哪个标题会很有趣 - 您可以尝试grep -rw _N /usr/include并查看它是否会弹出。

既然你知道这一点,如果你是勇敢的我猜你可以#undef _N,但实际上你应该改为_n这样的后缀或者更具描述性的后缀。