如何解决构造函数中的 C++ 模板
我有一个奇怪的问题,我的 C++ 代码无法构建;它以前能够构建,但我很困惑为什么我现在面临这个问题;
错误:C2065:'T':未声明的标识符
在类构造函数中的这一行。
Diagnostic(int* pointer,std::function<QVariant(int*)> fn = [](int* pointer){return QVariant::fromValue(std::remove_pointer_t<T>(pointer)) ;})
template<typename T>
class Diagnostic : QObject
{
using T3 = std::remove_pointer_t<T>;
public:
Diagnostic(int* pointer,std::function<QVariant(int*)> fn = [](int* pointer){return QVariant::fromValue(std::remove_pointer_t<T>(pointer));} )
{
}
};
int main(int argc,char *argv[])
{
int * test = new int;
*test=5;
Diagnostic<int*> dg(test);
delete test;
}
但是如果下面的代码没问题
template<typename T>
class Diagnostic : QObject
{
using T3 = std::remove_pointer_t<T>;
public:
Diagnostic(int* pointer)
{
std::function<QVariant(int*)> fn = [](int* pointer){return QVariant::fromValue(std::remove_pointer_t<T>(pointer)) ;};
}
};
但是第二个不是我想要的,因为我需要传递函数
在类实例化期间将 std::function
解决方法
如果删除不相关的细节,错误是由这样的代码引起的(MS VC++):
template<typename T>
Diagnostic(int* pointer,std::function<int(int)> = [](int n) {
int m = std::remove_pointer_t<T>();
return m;
});
// error C2065: 'T': undeclared identifier
编译器无法将类模板参数 T 识别为 lambda 主体内的类型,该类型被声明为默认参数。您可以通过事先声明模板 lambda 来绕过它:
template<typename U>
auto lam = [](int n) -> int {
auto v = U(); // use of U template parameter
return n;
};
template<typename T>
class Diagnostic {
public:
Diagnostic(int* pointer,std::function<int(int)> = lam<T>); // T from the class
在默认参数本身中使用类模板类型 T 是可以的。
但是,如果目标是将函数传递给基类,则可以编写:
class QObject {
public:
QObject(std::function<int(int)>) {}
};
template<typename T>
class Diagnostic : public QObject {
public:
Diagnostic(int* pointer) : QObject([](int n) {
int m = std::remove_pointer_t<T>();
return m;
}
)
尝试弄清楚发生了什么,简化表达式,从而降低复杂性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。