编译器错误:使用 g++ 编译时"does not name a type"宏

Compiler error: "does not name a type" in macro when compiling with g++

本文关键字:not does name type 错误 使用 g++ 编译 编译器      更新时间:2023-10-16

我正在尝试创建一个宏来删除类的复制和移动构造函数。这段代码在GCC 4.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

第二行没有发出编译器错误,但最后三行发出

KEYWORD_DELETE只是:

#if defined CPP11
    #define KEYWORD_DELETE = delete
#else
    #define KEYWORD_DELETE
#endif // defined CPP11

这是输出:

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

您没有发现error: stray '' in program

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

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

不能将//注释放在反斜杠行的连续符之后;如果要在宏中嵌入注释,则需要使用/* */注释,并将它们放在反斜杠前

另一个原因可能是:如果你正在处理类和友元函数,如果你在友元函数中调用了该类,而在调用该函数之前你不会声明该类-----比如:

#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;
}