C++ 无法编译返回MPI::Comm类型对象的函数

C++ 无法编译返回MPI::Comm类型对象的函数,c++,mpi,communicator,C++,Mpi,Communicator,要使用MPI运行我的软件,我需要创建一个简单的方法,该方法将返回MPI::COMM\u WORLD 在我的课堂上,我们有: #include <mpi.h> class Parallel{ public: MPI::Comm getCommunicator(){ return MPI::COMM_WORLD; } protected: int iproc; }; int main(int

要使用MPI运行我的软件,我需要创建一个简单的方法,该方法将返回
MPI::COMM\u WORLD

在我的课堂上,我们有:

#include <mpi.h>
class Parallel{      
    public:

        MPI::Comm getCommunicator(){
            return MPI::COMM_WORLD;
        }
    protected:

    int iproc;
};

int main(int argc, char *argv[]){

    Parallel* parallel;
    MPI::Init(argc, argv);
    int my_rank;
    my_rank = parallel->getCommunicator().Get_rank();
    MPI::Finalize();
    return 0;
}

Zuln是正确的,C++绑定从MPI 3中删除,所以新代码不应该使用它们编写。p> 它们被删除的原因是它们没有经过特别的考虑或维护,而且它们肯定不是很习惯用法,因此如果您使用它们,会遇到很多奇怪的情况。更好,但不幸的是,仅涵盖MPI 1

如果出于维护现有代码的目的,您必须具有此功能,那么问题正如所述-至少在OpenMPI中,MPI::Comm被定义为纯虚拟类,因此您无法返回该类型的对象,因为无法创建对象;只能返回子类型。(我认为这样做是为了让内部和内部通讯器成为子类型)

处理这种情况的经典方法是返回对对象的引用,而不是对象本身,并让编译器处理向上转换:

#include <mpi.h>
#include <iostream>

class Parallel{      
    public:
        MPI::Comm &getCommunicator(){
            return MPI::COMM_WORLD;
        }
    protected:
        int iproc;
};

int main(int argc, char *argv[]){

    Parallel* parallel;
    MPI::Init(argc, argv);
    int my_rank, size;

    my_rank = parallel->getCommunicator().Get_rank();
    size = parallel->getCommunicator().Get_size();
    std::cout << my_rank << "/" << size << std::endl;
    MPI::Finalize();
    return 0;
}

将C++绑定表示为MPI-2.2(2009)。在MPI-3.0中删除C++绑定。(2012). 无论如何,我不知道你到底在问什么。你想做什么?你的问题到底出在哪里?基本上,我正在使用HDF5 API在文件中写入并行数据。在我的代码中,我必须使用HDF5 API提供的一个函数:这个函数是:H5Pset_fapl_mpio(plist_id,MPI_COMM_WORLD,MPI_INFO_NULL);在我编写代码的软件中,我不能直接调用MPI_COMM_WORLD,因为MPI函数是封装的。因此,我想在一个类中编写一个返回通信器的方法,特别是MPI_COMM_WORLD。因此,我在上面编写了一个简单的代码来测试我的方法是否有效:最后,我在编译代码时会收到错误消息
#include <mpi.h>
#include <iostream>

class Parallel{      
    public:
        MPI::Comm &getCommunicator(){
            return MPI::COMM_WORLD;
        }
    protected:
        int iproc;
};

int main(int argc, char *argv[]){

    Parallel* parallel;
    MPI::Init(argc, argv);
    int my_rank, size;

    my_rank = parallel->getCommunicator().Get_rank();
    size = parallel->getCommunicator().Get_size();
    std::cout << my_rank << "/" << size << std::endl;
    MPI::Finalize();
    return 0;
}
$ mpic++ -o foo foo.cpp
$ mpiexec -np 4 ./foo
1/4
2/4
3/4
0/4