函数返回自定义托管类类型

时间:2017-03-26 08:10:23

标签: c++ c++-cli clr

我在使用C ++ / CLI时遇到问题。 我定义了一个名为Person的类,它是一个带有gets和sets的简单类:     #pragma一次     using namespace System;

namespace CLI
{
    public ref class Person
    {
    public:
        Person();
        // gets and sets
    private:
        String^ name;
        int age;
    };
}

然后我用person定义了一个矩阵类:     #pragma一次     #include“Person.h”     using namespace System;

namespace CLI
{
    // Next is the managed wrapper of Logic:
    public ref class Matrix
    {
    public:
        Matrix();
        Person^ getPerson(int i, int j)
        {
            return paa[i][j]; // no problem
        }
        void Destroy();
    private:
        array<array<Person^>^>^ paa;
    };
}

很奇怪,如果我将getPerson()函数移动到.cpp,就会出现错误。

这是Matrix.h&amp; Matrix.cpp有错误:

// Matrix.h
#pragma once
#include "Person.h"
using namespace System;

namespace CLI
{
    public ref class Matrix
    {
    public:
        Matrix();
        Person^ getPerson(int i, int j);
        void Destroy();
    private:
        array<array<Person^>^>^ paa;
    };
}


// Matrix.cpp
#include "Matrix.h"

CLI::Matrix::Matrix()
{
    // init the matrix
}

Person^ CLI::Matrix::getPerson(int i, int j) // errors here
{
    return paa[i][j];
}

其中一个错误显示“Undefined identifier:Person”,此错误指向函数返回类型。我试着写“Person ^ p = gcnew Person;”在函数体中,没有错误。 另一个错误说“函数定义与.h文件中的函数不兼容”(我没有使用英文版的VS,我翻译了消息,可能不太准确。)

如果我更改了任何非自定义的返回类型,比如int,String ^,那就没关系。

如果需要更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:0)

Person^ CLI::Matrix::getPerson(int i, int j)

PersonCLI命名空间中定义,但您在此处未引用该命名空间。

您没有在头文件中收到错误消息,因为声明包含在namespace CLI { }块中,而cpp文件没有。

要解决此问题,我建议您将cpp文件中的所有代码括在namespace CLI { }块中,并从各种声明中删除CLI::。我认为这看起来比其他解决方案更清晰,即完全限定返回类型(CLI::Person^)。