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++;
};
相关:相关: