Предупреждение компоновщика MSVC ++ при использовании языка PIMPL в C ++ / CLI - PullRequest
2 голосов
/ 02 декабря 2008

Я пишу сборку .NET, используя C ++ / CLI (версия 9.0), и я хотел бы использовать идиому PIMPL, чтобы избежать размещения ненужных вещей в моем общедоступном заголовке. К сожалению, когда я пытаюсь переслать объявление класса и затем использовать для него дескриптор отслеживания, я получаю предупреждение Linker 4248:

предупреждение LNK4248: неразрешенный токен typeref (0100000E) для 'MyNamespace.PrivateClass'; изображение может не работать

Это, кажется, имеет место, использую ли я класс CLI или собственный класс для класса реализации.

Пример кода приведен ниже:

namespace MyNamespace
{
    ref class PrivateClass; // forward dec

    ref class MyPublicClass
    {
    private:
        PrivateClass^ m_Imp;
    };
}

К сожалению, объяснение Microsoft не слишком информативно.

Ответы [ 2 ]

2 голосов
/ 05 декабря 2008

Я думаю, что вы используете две технологии, которые не очень хорошо сочетаются друг с другом:

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

Естественным приложением для C ++ / cli является написание небольших узких кусочков взаимодействия, и поведение VS по умолчанию в этих проектах - помещать весь код в заголовки, что является как можно более низким уровнем защиты от pimpl. 1005 *

Если вы пишете что-то достаточно большое, чтобы оправдать pimpl, я бы не рекомендовал C ++ / cli. Если вы пишете что-то достаточно маленькое, чтобы сделать C ++ / cli подходящим, я бы не стал беспокоиться о pimpl.

YMMV конечно, но это было бы мое мнение ...

1 голос
/ 05 декабря 2008

После дальнейшего изучения и размышлений я обнаружил, что в некоторых отношениях .NET на самом деле не нужно поддерживать PIMPL таким же образом, как в C ++, поскольку вы можете пометить класс как отдельный для сборки - это, по сути, имеет тот же эффект, несколько способов. Однако часто идиома PIMPL используется для скрытия заголовков, которые вы не хотите, чтобы клиент компилировал. Но, разумеется, сборки .NET не «включаются», как заголовки для C ++, так что я думаю, что здесь действительно нет проблем.

...