Проблема создания управляемых классов и пространств имен в C ++ / CLI - PullRequest
3 голосов
/ 14 июля 2011

У меня проблемы с созданием управляемого класса с пространством имен в C ++ / CLI.

Я хотел бы сделать следующее:

#pragma once
#include "abc.h"
#ifdef _MANAGED
#using <system.dll>
using namespace System;
using namespace System::IO;
using namespace System::Collections::Generic;
using namespace System::Globalization;
#endif

namespace Animals
    {
    public ref class Pets
        {
        Pets::Pets(){}
        };
    }

У меня есть пара разных проблем:

A) Когда я помещаю этот код в файл .cpp, он прекрасно компилируется.Однако кажется, что пространства имен не работают должным образом (см. Этот вопрос, который я создал: Пространство имен не распознано в C ++ / CLI ). Единственный ответ в списке говорит, что я должен объявить классы / пространства имен в заголовочном файле.Но это проблема, потому что ..

B) Компилятор жалуется на public ref class Pets, когда он помещается в заголовочный файл.Он говорит, что должна быть синтаксическая ошибка.

intellisense error:

expected a declaration

другие ошибки:

'{' : missing function header (old-style formal list?)

syntax error: 'public'

Кажется, я не могу найти хороших примеров C ++ / CLI, которые бы отображали заголовок и файл cpp.

Поэтому мой вопрос: как я могузаставить управляемый класс и пространство имен работать как положено?(то есть, что я делаю не так?)

Пожалуйста, дайте мне знать, если мне нужно больше информации.

Заранее спасибо за ваше время и терпение:)

1 Ответ

3 голосов
/ 14 июля 2011

В заголовочном файле должны быть только предварительные объявления.

// abc.h
#pragma once

namespace Animals
{
    public ref class Pets
    {
        Pets(); // forward declaration
        // Pets::Pets is redundant and wrong, because you are inside 
        // the class Pets
    };
}


// abc.cpp
#include "abc.h"
#ifdef _MANAGED
#using <system.dll>
using namespace System;
using namespace System::IO;
using namespace System::Collections::Generic;
using namespace System::Globalization;
#endif

namespace Animals
{
    Pets::Pets() {}  // implementation
    // Now Pets::Pets() is right, because you dont write the class... wrapper again.
}
...