Добавление #pragma make_public (Type) не удаляет ошибку C3767 - PullRequest
1 голос
/ 08 февраля 2012

У меня есть ассемблер (A), который определяет класс Managed, имеющий открытый конструктор, который принимает два собственных типа.

У меня есть доступ к файлам заголовков и скомпилированным файлам lib, которые содержат собственные типы.

Я создал проект C++/CLI и определил ref class, который содержит один метод public: static, который возвращает открытый тип, определенный в (A).

Когда я пытаюсь создать структуру, передавв нативном типе я получаю `C3767 'YourType :: TypeB': функции (и) кандидата, недоступные.

Я добавил #pragma make_public(Type) для нативных типов и любого типа, от которого они происходят, но все еще нетjoy.

Мой заголовок класса:

#pragma once
#include "StdAfx.h"

using namespace System;
using namespace AssemblyA;

namespace NativeWrapper {
    ref class MyFactory
    {
    public:
        static AssemblyAType^ Build();
    };
}

Мой cpp-файл:

#include "StdAfx.h"

#pragma make_public(nativeObjectRoot)
#pragma make_public(nativeObjectDerived)


#include "MyFactory.h"

using namespace System;

using namespace NativeWrapper;

AssemblyAType^ MyFactory::Build()
{
  nativeObjectDerived* myNativeObject;
  //myNativeObject initialised and set up here
  return gcnew AssemblyAType(myNativeObject); <--C3767
}

Я посмотрел, и у управляемого типа `AssemblyAType 'есть открытый конструктор сэта подпись.Не получается заставить прагму работать ??

Итак, подведем итог.

Мой проект C ++ / CLI ссылается на стороннюю сборку, которая определяет тип, который принимает собственный конструктор в своем конструкторе.,Мой проект также имеет добавленные / связанные файлы заголовка / lib.

Примечание: мой код выше не совсем то, что у меня есть, но я удалил соответствующие части.

1 Ответ

2 голосов
/ 09 февраля 2012

make_public сделает родной тип видимым для потребителей сборки, где вы его используете: http://msdn.microsoft.com/en-us/library/ms235607(v=vs.80).aspx. Это не изменит видимость в сборке, на которую вы ссылаетесь.

Похоже, что сборка, на которую вы ссылались, должна была иметь make_public для нативного типа или просто объявить нативный тип public (см. Тип visibilty для заголовка. Поделиться файлом заголовка, совместно используемым между нативным и управляемым клиентами ).

Кажется, на следующей странице указано, что они должны были получить предупреждение за написание метода, не делая общедоступные типы открытыми: http://msdn.microsoft.com/en-us/library/ms173713(v=vs.80).aspx

Возможно, вы могли бы опубликовать сторонний код AssemblyAType, чтобы убедиться, что больше ничего не пропало.

...