隐式用户定义的强制转换操作符(有时)不适用于const类型

时间:2013-12-06 16:47:18

标签: c++-cli

我试图让我们的C ++和.NET代码之间的一些IJW包装器更容易使用。

以下是我们的包装器平台的测试情况:

// NativeWrapper.h
#pragma once
template <class T>
public ref class NativeWrapper
{
public:
    // ...
    operator T* ();
    operator T& ();
    // ...
};

// Test.h
#pragma once
class Test { /* ... */ };
#pragma make_public( Test )

// TestN.h
#pragma once
#include "NativeWrapper.h"
#include "Test.h"

public ref class TestN : public NativeWrapper<Test>
{ /* ... */ };

// main.cpp
#include "TestN.h"

void f(const Test&) { /* ... */ }

int main()
{
    TestN^ t = gcnew TestN();
    f(t);
    return 0;
}

从TestN ^到const Test&amp;的隐式转换通过用户定义的运算符Test&amp;()可以正常工作,正如我预期的那样。

但是,当我在我的生产代码中尝试这个时,情况有所不同。它无法找到正确的转换。我必须做以下事情:

f((Test&)t);

我无法确定我在测试中所做的与我在主代码库中所做的事情之间存在的任何根本区别。 NativeWrapper模板完全相同。

当唯一可接受的类型是const引用类型时,哪种类型的情况可能导致编译器无法使用非const转换运算符?

感谢。

0 个答案:

没有答案