奇怪的重复模板模式。没有匹配函数调用..模板 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);
我正在尝试用 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);