访问通用成员变量会引发编译错误

时间:2015-08-17 10:58:25

标签: generics c++-cli managed-c++

我有C ++ / CLI代码,如下所示:

  interface class Type
  {

  };
  public ref class Type1 : Type
  {
  public:
    double a;
  };

  public ref class Type2 : Type
  {
  public:
    double b;
  };

  generic <typename T> where T:Type
  array<T>^ TestClass::TestFunction()
  {
    array<T>^ result = gcnew array<T>(1);
    result[0].b = 10.0;
    return result;
  }

Type1Type2没有任何共同之处,因此我没有在Type中保留任何内容来实施。它仅用于泛型语法,我创建了Type

当我尝试使用TestFunctionType1致电Type2时,他们的成员a&amp; b无法访问。 编译说,ab不是Type的成员。

你能告诉我我在这里做错了吗?

1 个答案:

答案 0 :(得分:3)

    resultBuffer[0].b = 10.0;

最好是在编程编辑器中编写代码而不是SO问题框。你只是增加了混乱,这至少需要result[0]->b = 10.0;。但当然真正的问题是它根本不是通用代码。正如发布的那样,如果你把它写成模板而不是泛型,那么它只会工作,然后只能用Type2作为模板参数。这也没用。

.NET泛型要求您约束类型参数,使其始终具有b属性,因此始终可以在运行时为任何T生成该方法。因此,您的接口必须看起来像:

interface class IType
{
    property double b { double get(); void set(double); };
};

实际上只需要制定者,我认为你在实践中需要吸气剂。如何在继承接口的类中实现接口是你需要考虑的事情,我无法做出合理的猜测。