C ++ / CLI: функции, унаследованные от класса шаблона, не видны в C # - PullRequest
4 голосов
/ 13 декабря 2011

Мне трудно понять, как сделать функции родительского класса видимыми в C #.

Предположим, у меня есть шаблонный класс, который определяет функцию foo ()

template <int Dim, typename Type>
public ref class FixedNP
{
public:
  float foo() {return 1;};
};

Тогда у меня есть класс, который наследуется от шаблона FixedNP:

public ref class Vector3fP : public FixedNP<3, float>
{
}

Когда я пытаюсь вызвать функцию foo () из C #, например.

Vector3fP bar = new Vector3fP();
bar.foo();

itговорит, что функция Vector3fP не содержит определения для foo.

Когда я перемещаю определение foo () в класс Vector3fP, он работает нормально.Однако в реальном коде это невозможно, поскольку шаблон FixedNP содержит довольно много функций, которые должны быть унаследованы от примерно 4 различных классов.

После некоторых поисков в Интернете я обнаружил, что добавление

using FixedNP<3, float>::foo;

, чтобы Vector3fP исправил подобную проблему для кого-то.Однако в моем случае это просто приводит к другой ошибке, на этот раз при компиляции кода C ++ / CLI:

ошибка C3182: «Vector3fP»: декларация использования члена или декларация доступа недопустима в управляемойвведите

Есть предложения, как сделать мои функции видимыми в C #?

1 Ответ

2 голосов
/ 14 декабря 2011

Я думаю, что они ключ в этом требовании от Управляемые шаблоны на MSDN :

Если шаблон не создан, он не генерируется в метаданных.Если создается экземпляр шаблона, в метаданных будут отображаться только ссылочные функции-члены.

Это означает, что функции, которые не используются в коде C ++, не будут в сгенерированной DLL, и вы не будетебыть в состоянии использовать их из C #.Чтобы это исправить, вы можете добавить в свой код C ++ фальшивую функцию, которая ссылается на эту функцию:

void phony()
{
    auto vec = gcnew Vector3fP();
    vec->foo();
}
...