我想在C#中使用C ++ / CLI dll实现一个接口。但我猜我在C ++中遇到了返回值优化的问题。考虑
// BVHTree.cpp:
public value struct Vector3
{
float X, Y, Z;
};
public value struct TriangleWithNormal
{
Vector3 A, B, C, Normal;
};
public interface class IBVHNode
{
property TriangleWithNormal Triangle { TriangleWithNormal get(); } // among others
property bool IsLeaf { bool get(); } // can implement this
};
// BVHNode.cs:
public class BVHNode : IBVHNode // Error: member TriangleWithNormal* IBVHNode.get_Triangle(TriangleWithNormal*) not implemented (sth. along those lines)
{
public TriangleWithNormal Triangle { get { return new TriangleWithNormal(); } }
public bool IsLeaf { get { return true; } }
}
抱怨BVNode
没有实施IBVHNode
。我的最后一招是通过常规方法或使用像visual studio建议的不安全模式访问它:
public TriangleWithNormal* get_Triangle(TriangleWithNormal* t)
{
throw new NotImplementedException();
}
有没有办法在属性语法中实现它(除了使TriangleWithNormal
成为ref class
...)?
更新1 似乎是出于同样的原因实现方法TriangleWithNormal GetTriangle()
失败。但是,您可以像void GetTriangle(TriangleWithNormal%);
一样使用它。
答案 0 :(得分:2)
我修复了一些次要的语法错误(;
在C ++ / CLI中的类声明之后,错过了单词bool
作为IsLeaf.get()
的返回类型) ,并定义了Vector3类型。
我猜到你如何定义Vector3,它不是我熟悉的标准类。它在哪里定义?它是托管类,托管结构还是非托管? (我为我的测试定义为public value struct Vector3 { double x, y, z; };
。)
正如我所说,您在此处发布的C ++ / CLI代码中存在轻微的语法错误。这两个错误给出了非常明显的编译错误,所以我假设这些是从Visual Studio到Web的转录中的拼写错误。您发布的内容与实际代码之间是否有任何其他更改?
此外,我无法收到您报告的错误消息member TriangleWithNormal* IBVHNode.get_Triangle(TriangleWithNormal*) not implemented
。我总是以编译错误error CS0535: 'CSharpTest.BVHNode' does not implement interface member 'CppCLITest.IBVHNode.Triangle'
结束。
您显示的属性不带参数,但编译器错误显示的方法get_Triangle
采用类型为TriangleWithNormal*
的参数。你是否在某个地方有另一个属性声明,或明确声明该方法?
我想我可能有。如果我尝试将C ++ / CLI属性声明为索引属性,那么我会获得类似于您所看到的方法签名。
在您的实际代码中,您是否有类似这样的内容:
property TriangleWithNormal Triangle[TriangleWithNormal] { TriangleWithNormal get(TriangleWithNormal input); }
这是一个索引属性,C#不允许您实现。 (C#允许一个索引属性this[]
,但只允许一个。)
当我尝试在C#中实现它时,它需要我显式实现属性的支持方法,而不是将其实现为C#属性。
public TriangleWithNormal get_Triangle(TriangleWithNormal input)
{
return new TriangleWithNormal();
}
使索引属性成为常规属性,这对你来说应该没问题。
答案 1 :(得分:0)
事实证明,在我使用void GetTriangle(TriangleWithNormal%);
解决方法生成一些构建周期后,错误消失了。这是一个奇迹或更可能是一个无声的干净构建,在评论错误的属性试图再次重现错误条件,它编译开箱即用。