奇怪的重复模板模式和调用运算符重载 [duplicate]

Curiously recurring template pattern and call operator overload [duplicate]

提问人:edrezen 提问时间:4/3/2023 更新时间:4/3/2023 访问量:121

问:

我正在使用 Curiously Recurring Template Pattern 和调用运算符重载,并且我遇到了无法解释的编译错误。我定义了以下类:

template<class DERIVED>
struct Base
{
    void operator() (int n) const {}
    void foo        (int n) const {}
};

struct Derived : Base<Derived>
{
    void operator() (int n, int m) const {}
};

int main()
{
    Derived  x;
    
    x (1,2);                            // ok
    x (1);                              // ko -> does not compile
    static_cast<Base<Derived>>(x) (1);  // ok
    x.foo(1);                           // ok
}

我可以实例化,编译器对 中定义的运算符感到满意,但对 中定义的运算符不满意;我必须强制对类进行static_cast才能使一个 arg 运算符工作。另一方面,调用 时没有问题。xDerivedBaseBasefoo

为什么一个 arg 重载不能直接在派生实例上使用?

C++ Templates 运算符重载

评论

1赞 Alan Birtles 4/3/2023
您不能重载基类中的函数,任何重载都会隐藏基类函数:godbolt.org/z/x9TG96h3r

答:

2赞 Ted Lyngmo 4/3/2023 #1

operator()in 隐藏基类中的运算符。如果您希望能够调用基类,请将其带入:Derivedoperator()Derivedusing

struct Derived : Base<Derived>
{
    using Base<Derived>::operator();

演示