在c++ /CLI中创建托管类和命名空间的问题

本文关键字:命名空间 问题 c++ CLI 创建 | 更新日期: 2023-09-27 18:02:02

我在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被放置在头文件中时,编译器会报错。它说一定有语法错误。

智能提示错误:

expected a declaration

其他错误:

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

syntax error: 'public'

我似乎找不到任何优秀的c++/CLI示例来同时显示头文件和cpp文件。

所以我的问题是:我如何使托管类和命名空间都按预期工作?(即我做错了什么?)

如果我还需要更多的信息,请告诉我。

提前感谢您的时间和耐心:)

在c++ /CLI中创建托管类和命名空间的问题

头文件中应该只有前向声明

// 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.
}