Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 操作员++;对于编译器,“从CRTP基”不可见_C++_Operator Overloading_Crtp - Fatal编程技术网

C++ 操作员++;对于编译器,“从CRTP基”不可见

C++ 操作员++;对于编译器,“从CRTP基”不可见,c++,operator-overloading,crtp,C++,Operator Overloading,Crtp,以下面的代码为例: template<class Derived> struct base { Derived operator++(int){ auto tmp = static_cast<Derived &>(*this); ++static_cast<Derived &>(*this); return tmp; } }; struct der : public base&l

以下面的代码为例:

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
}
模板
结构基{
派生运算符++(int){
自动tmp=静态施法(*此);
++静态施法(*本);
返回tmp;
}
};
结构:公共基础{
der&运算符++(){
归还*这个;
}
};
int main(){
d;

d++;//用名称
f
替换名称
operator++
(也就是说,用普通成员函数尝试相同的方法)。您也会遇到同样的问题。编译器会在
der
中找到命名函数,因此它不会在
base
中查找。重载只会在同一范围内定义的函数之间发生。

将名称
运算符+
替换为名称
f
(即对普通成员函数进行相同的尝试)。您也会遇到同样的问题。编译器会在
der
中找到指定的函数,因此它不会在
base
中查找。重载只会在同一范围内定义的函数之间发生。

您的两个函数具有相同的名称,
operator++
。它的拼写与使用标识符命名的函数不同。Th类成员查找的规则是,默认情况下,如果在派生类中找到名为的成员,则不检查基类。派生成员“隐藏”基类成员

避免隐藏具有不同签名的基类函数并允许重载解析选择最佳函数的常用方法是使用using声明:

struct der : public base<der> {
    der &operator++(){
        return *this;
    }
    using base<der>::operator++;
};
结构顺序:公共基{ der&运算符++(){ 归还*这个; } 使用base::operator++; };
您的两个函数具有相同的名称,
operator++
。它的拼写与使用标识符命名的函数不同。类成员查找的规则是,默认情况下,如果在派生类中找到具有该名称的成员,则不会选中基类。派生成员“隐藏”基类成员

避免隐藏具有不同签名的基类函数并允许重载解析选择最佳函数的常用方法是使用using声明:

struct der : public base<der> {
    der &operator++(){
        return *this;
    }
    using base<der>::operator++;
};
结构顺序:公共基{ der&运算符++(){ 归还*这个; } 使用base::operator++; }; 相关:相关: