编译器错误:使用 g++ 编译时"does not name a type"宏
Compiler error: "does not name a type" in macro when compiling with g++
我正在尝试创建一个宏来删除类的复制和移动构造函数。这段代码在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;
}
相关文章:
- 将系数存储在头文件的数组中("does not name a type"错误)
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- 由于"error C4430: missing type specifier - int assumed. Note: C++ does not support default-int",我现在无法编
- 如何解决"'mutex' in namespace 'std' does not name a type"?
- 在 C++ 中使用命名空间时出现"does not name a type"错误
- 已声明时"Does not name a type"错误
- 嵌套类"does not name a type"
- 这在C++ "It does not own the underlying data, and so is cheap to copy or assign"中意味着什么
- Eigen loadMarket does not compile
- 为什么当我的代码超出函数范围时,"does not name a type"出现编译器错误?
- 创建C++ Redis 模块 - "does not export RedisModule_OnLoad() symbol"
- 无法分隔标头类。我得到"does not name a type"
- 模板元编程:"does not have integral or enumeration type"
- 如何修复类函数"prototype does not match"和"cadidate is"错误
- #define 的"Declaration does not declare anything"错误
- 修复第三方代码:"error: ‘enable_if’ in namespace ‘std’ does not name a template type"
- 在 c++ 中,如果包含标头,为什么我会收到'does not a name of type'错误?
- 什么原因导致我的"‘FatalError’ in namespace ‘Foam’ does not name a type"错误?
- C++ 迭代器错误"does not refer to a value"
- 编译错误"String does not name a type"