【问题标题】:No suitable conversion function from [class name] to [class name]*没有合适的从 [类名] 到 [类名] 的转换函数*
【发布时间】:2016-11-30 08:08:22
【问题描述】:

我是 c++/cli 的新手,我面临的情况是: 我正在做的项目需要使用外部 dll,在我的函数中我需要使用来自这个 dll 的类 A、B 和 C,我将它们放在我的 .h 文件中,.h 文件看起来像:

#include library I use
    public ref class MyClass
    {
    public:
            MyClass();
            ~MyClass();
            otherfuc();
    private:
            A *a;
            B *b;
            C *c;
    }

我的 .cpp 文件看起来像:

MyClass::MyClass() 
{
    a = new A();
    b = new B(*a);
    c = b->func();   //error happened
}
MyClass::otherfunc()
{
    c->func_c()
}

A、B、C 类是非托管类,所以我只有一种方法可以在托管类中声明它们,就像我在头文件中一样。在B类中,有一个叫做func的函数,这个函数返回类类型C,我试过c = &b->func(),这样会抛出AccessViolationException,如果我试过c = b->func,那么错误是函数调用缺少参数。我该怎么办,求救!!!

【问题讨论】:

  • b->func() 正在返回一个临时对象实例。您将其地址存储在 MyClass::c 中。当构造函数退出时,临时对象被销毁并且 MyClass::c 包含无效地址。稍后您调用 otherfunc() 并使用 'c' 中的无效地址导致访问冲突。
  • 感谢您的回复。它有助于我理解。对于这个特定的问题,你知道我可以做些什么来实现它吗?我真的很感激。@tukra

标签: c++-cli


【解决方案1】:

根据你写的,我的猜测是 B::func() 被声明为返回一个 C 实例作为临时实例:

class B {
public:
    C func();
};

分配一个 C 实例作为临时副本:

class A {
};

class C {
public:
    C(int _i) : i(_i) {}
    int func_c() { return i; }

    int i;
};

class B {
public:
    B(A & a) {}
    C func() { return C(5); }
};

public ref class MyClass {
public:
    MyClass();
    ~MyClass();
    int otherfunc();
private:
    A *a;
    B *b;
    C *c;
};

MyClass::MyClass()
{
    a = new A();
    b = new B(*a);
    c = new C(b->func());
}

MyClass::~MyClass() {
    delete a;
    delete b;
    delete c;
}

int MyClass::otherfunc()
{
    return c->func_c();
}

void f() {
    MyClass^ mc = gcnew MyClass();
    int i = mc->otherfunc();
}

这假设 C 是可复制的(或可移动的)并且复制它对你正在做的事情有意义。

【讨论】:

  • C 是一个非托管类,我认为我不能以你的方式声明它。@tukra
  • 哈,当然。我将示例修复为完整的工作代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多