CRTP基础的操作员 对于编译器而言不可见
Operator++ from CRTP base is not visible for compiler
以以下代码为例:
template<class Derived>
struct base {
Derived operator++(int){
auto tmp = static_cast<Derived &>(*this);
++static_cast<Derived &>(*this);
return tmp;
}
};
struct der : public base<der> {
der &operator++(){
return *this;
}
};
int main(){
der d;
d++;/// <<< compilation error here
}
我从编译器中获得以下错误:
错误:否'operator (int)'为postfix' '[-fpermissive]
为什么我的后缀操作员在编译器中不可见?它是否包含某种错误,还是我C 功能不知道?可以修复此代码以使后缀operator++
按预期工作吗?
您的两个功能具有相同的名称operator++
。它的拼写与标识符命名的函数的拼写不同。类成员查找的规则是,默认情况下,如果在派生类中找到具有名称的成员,则未检查基类。派生成员"隐藏"基本成员。
避免使用不同签名隐藏基类功能并允许超载分辨率选择最佳功能的通常方法是使用使用:
struct der : public base<der> {
der &operator++(){
return *this;
}
using base<der>::operator++;
};
用名称 f
替换名称operator++
(即使用普通成员函数尝试相同的东西)。您会遇到同样的问题。编译器在der
中找到命名函数,因此它不会在base<dir>
中查看。超载仅发生在同一范围中定义的函数之间。
相关文章:
- C/C++编译器通常会删除重复的库吗
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- Win32编译器选项和内存分配
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++,我收到一个无法理解的编译器错误
- 在线编译器中的分段C++没有打印消息
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- C/C++预处理器是否可以检测一些编译器选项
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 我需要知道编译器如何在cpp中使用析构函数
- 编译器如何区分std::vector的构造函数
- CLANG 编译器 说:变量"PTR"可能未初始化
- <<操作员在下面的行中工作
- 告诉c++编译器该参数没有别名
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么所有C++编译器都会崩溃或挂起此代码
- CRTP基础的操作员 对于编译器而言不可见
- 为什么C 标准要求编译器忽略对基本类型转换操作员的呼叫