奇怪的重复模板模式。没有匹配函数调用..模板 argument/substitution 失败

Curiously recurring template pattern. No matching function for call to.. template argument/substitution failed

我正在尝试用 C++ 实现 Curiously Recurring Template Pattern,但我无法让它工作。有人可以指出我的代码有什么问题吗?

template <typename T>
struct Base {
    int x;
    Base():x(4){}
};

struct Derived: Base<Derived> {
    Derived(){}
};

template<typename H>
void dosomething(Base<H> const& b) {
    std::cout << b.x << std::endl;
}


int main() {
    Derived k();
    dosomething(k);
}

我试图保持 dosomething 的签名不变,以便任何实现 Base 中的方法的 class 都可以在 dosomething() 中使用。

这是我遇到的错误:

||=== Build: Debug in test (compiler: GNU GCC Compiler) ===|
In function ‘int main()’:
error: no matching function for call to ‘dosomething(Derived (&)())’
note: candidate: template<class H> void dosomething(const Base<H>&)
note:   template argument deduction/substitution failed:
note:   mismatched types ‘const Base<H>’ and ‘Derived()’

为什么会出现此错误?调用 dosomething() 时,编译器不应该将 k 视为常量引用吗?

这是令人烦恼的解析结果。本声明:

Derived k();

是函数。您应该使用 Derived k;Derived k{};.

Derived k(); // function declaration

它是一个函数声明,它没有参数和return Derived对象。 编译器错误通过

告诉您
no matching function for call to ‘dosomething(Derived (&)())
                                              ^^^^^^^^^^^^^

尝试

 Derived k; // instance of object
 dosomething(k);