微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

构造函数中的 C++ 模板

如何解决构造函数中的 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 fn 转换为基类。 任何帮助表示赞赏。我不知道为什么以前我可以构建代码时会出现这样的错误

解决方法

如果删除不相关的细节,错误是由这样的代码引起的(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 举报,一经查实,本站将立刻删除。