gpt4 book ai didi

c++ - 返回对模板 vector 的引用

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:22:20 24 4
gpt4 key购买 nike

我从简单的类声明开始,我在其中定义了内联模板方法,该方法返回对特定类型容器的引用。

class JPetParamManager
{
public:
enum ContainerType {kScintillator, kPM, kKB, kTRB, kTOMB};

std::vector<JPetScin> fScintillators;
std::vector<JPetPM> fPMs;
std::vector<JPetKB> fKBs;
std::vector<JPetTRB> fTRBs;
std::vector<JPetTOMB> fTOMBs;

template <typename T>
const std::vector<T>& getContainer(const JPetParamManager::ContainerType &p_containerType) const
{
switch(p_containerType)
{
case kScintillator:
return fScintillators;
case kPM:
return fPMs;
case kKB:
return fKBs;
case kTRB:
return fTRBs;
case kTOMB:
return fTOMBs;
}
}
}

在另一个类方法中,我想从上面的类中返回一些容器:

void JPetAnalysisModuleKB::CreateOutputObjects(const char* outputFilename)
{
std::vector<JPetKB> l_KBs22 = m_manager.getParamManagerInstance().getContainer<JPetKB>(JPetParamManager::ContainerType::kKB);
}

当我想在 main 中运行这个方法时,出现如下错误:

./../../framework/JPetManager/../JPetParamManager/JPetParamManager.h: In member function ‘const std::vector<_RealType>& JPetParamManager::getContainer(const JPetParamManager::ContainerType&) const [with T = JPetKB]’:
JPetAnalysisModuleKB.cpp:55:126: instantiated from here
./../../framework/JPetManager/../JPetParamManager/JPetParamManager.h:81:14: error: invalid initialization of reference of type ‘const std::vector<JPetKB>&’ from expression of type ‘const std::vector<JPetScin>’
./../../framework/JPetManager/../JPetParamManager/JPetParamManager.h:83:14: error: invalid initialization of reference of type ‘const std::vector<JPetKB>&’ from expression of type ‘const std::vector<JPetPM>’
./../../framework/JPetManager/../JPetParamManager/JPetParamManager.h:87:14: error: invalid initialization of reference of type ‘const std::vector<JPetKB>&’ from expression of type ‘const std::vector<JPetTRB>’
./../../framework/JPetManager/../JPetParamManager/JPetParamManager.h:89:14: error: invalid initialization of reference of type ‘const std::vector<JPetKB>&’ from expression of type ‘const std::vector<JPetTOMB>’
make: *** [JPetAnalysisModuleKB.o] Błąd 1

最佳答案

简介

即使您的 switch-labels 中只有一个会匹配并执行,与其他标签关​​联的语句仍然必须有效。

编译器试图告诉您,在返回 std::vector<T> const& 时,并非所有的返回值都可以使用(其中 T 是传递给您的函数的类型)。


说明

下面实例化getContainer以使其返回 std::vector<PetKB> 的方式,但是在实例化该函数时,编译器将看到与 kScintillator 匹配的 case-label 具有 std::vector<JPetScin> 类型的返回值.

m_manager.getParamManagerInstance().getContainer<JPetKB> (JPetParamManager::kScintillator)

std::vector<JPetScin>无法转换为 std::vector<PetKB>编译器提示并基本上说您的代码格式错误。

即使 switch-condition 没有选择返回类型不同的 case 也是如此; 所有 路径都必须能够返回,否则应用程序的格式不正确。

关于c++ - 返回对模板 vector 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24191637/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com