C++ 编译器错误:";不为类型命名";在宏中使用g++;

C++ 编译器错误:";不为类型命名";在宏中使用g++;,c++,macros,C++,Macros,我试图创建一个宏来删除类的复制和移动构造函数。 这段代码在GCC4.8.2上编译失败,有什么问题? 如果我将所有内容放在一行上,代码就会编译 #define DISALLOW_COPY_AND_MOVE(ClassName) \ ClassName(const ClassName&) KEYWORD_DELETE; \ // Copy constructor ClassName& operator=(c

我试图创建一个宏来删除类的复制和移动构造函数。 这段代码在GCC4.8.2上编译失败,有什么问题? 如果我将所有内容放在一行上,代码就会编译

#define DISALLOW_COPY_AND_MOVE(ClassName)                   \
    ClassName(const ClassName&) KEYWORD_DELETE;             \  // Copy constructor
    ClassName& operator=(const ClassName&) KEYWORD_DELETE;  \  // Copy assignment operator
    ClassName(ClassName &&) KEYWORD_DELETE;                 \  // Move constructor
    ClassName& operator=(ClassName&&) KEYWORD_DELETE;          // Move assignment operator
第二行不发出编译器错误,但最后三行发出编译器错误

关键字_DELETE只是:

#if defined CPP11
    #define KEYWORD_DELETE = delete
#else
    #define KEYWORD_DELETE
#endif // defined CPP11
这是输出:

In file included from ..\ObjectSlicing\src\main.cpp:5:0:
..\ObjectSlicing\src\__rm_utilities__/__rm_utilities__.h:26:5: error: stray '\' in program
     ClassName& operator=(const ClassName&) KEYWORD_DELETE;  \  // Copy assignment operator
     ^
..\ObjectSlicing\src\__rm_utilities__/__rm_utilities__.h:27:5: error: stray '\' in program
     ClassName(ClassName &&) KEYWORD_DELETE;                 \  // Move constructor
     ^
In file included from ..\ObjectSlicing\src\__include__/animals:5:0,
                 from ..\ObjectSlicing\src\main.cpp:6:
..\ObjectSlicing\src\__include__/../animals/cat.h:28:5: error: stray '\' in program
     DISALLOW_COPY_AND_MOVE(Cat)
     ^
In file included from ..\ObjectSlicing\src\__include__/animals:6:0,
                 from ..\ObjectSlicing\src\main.cpp:6:
..\ObjectSlicing\src\__include__/../animals/dog.h:28:5: error: stray '\' in program
     DISALLOW_COPY_AND_MOVE(Dog)
     ^
In file included from ..\ObjectSlicing\src\main.cpp:5:0:
..\ObjectSlicing\src\__rm_utilities__/__rm_utilities__.h:26:5: error: 'ClassName' does not name a type
     ClassName& operator=(const ClassName&) KEYWORD_DELETE;  \  // Copy assignment operator
     ^
..\ObjectSlicing\src\__rm_utilities__/__rm_utilities__.h:27:14: error: expected constructor, destructor, or type conversion before '(' token
     ClassName(ClassName &&) KEYWORD_DELETE;                 \  // Move constructor
              ^
..\ObjectSlicing\src\__rm_utilities__/__rm_utilities__.h:28:5: error: 'ClassName' does not name a type
     ClassName& operator=(ClassName&&) KEYWORD_DELETE;          // Move assignment operator
     ^

您没有在程序中发现错误:游离的“\”

插入符号位于错误的位置;它应该指向反斜杠:

..\ObjectSlicing\src\__rm_utilities__/__rm_utilities__.h:26:5: error: stray '\' in program
     ClassName& operator=(const ClassName&) KEYWORD_DELETE;  \  // Copy assignment operator
                                                             ^ -- here

不能将
/
注释放在反斜线连续器之后;如果要在宏中嵌入注释,则需要使用
/**/
注释并将其放在反斜线之前。

另一个原因可能是: 如果您正在使用类和友元函数,并且您在友元函数中调用了在调用该函数之前不会声明的类,则如下所示:

#包括
使用名称空间std;
//第二类;
头等舱{
公众:
int val1;
无效设置值(内部tval){
val1=tval;
}
无效显示(){

宏中的cout`\`必须是换行符之前的最后一个字符,您不能将注释放在其中?宏定义中的斜杠必须是行中的最后一个字符,否则无效(您必须删除注释或将其放在斜杠之前)让一个宏用于C++11然后不用于移动语义有意义吗?当您运行代码时,g++编译器会出错,因此您需要重新运行第三行,取消注释
#include <iostream>
using namespace std;
//class Second;
class first{

public:
    int val1;
    void setVal(int tval){
        val1=tval;
    }
    void display(){
        cout<<"in first value 1 is:"<<val1<<endl;
    }

    friend Second sum(first fobj,Second sobj);      
   };
  class Second{
  public:
  int val2;
    void setVal(int tval){
        val2=tval;
    }
    void display(){
        cout<<"in second value 2 is:"<<val2<<endl;
    }
    friend Second sum(first fobj,Second sobj);      
 };
Second sum(first fobj,Second sobj){
Second rel;
rel.val2=fobj.val1+sobj.val2;
return rel;
} 

int main(){
first f1;
Second s1;
f1.setVal(50);
s1.setVal(2);
f1.display();
s1.display();

Second rel=sum(f1,s1);
rel.display();
return 0;
}