如何从FunctionCombiner类返回内部估值函数的引用向量?
解决返回内部
valuationFunction引用集合的编译问题 首先得明确:C++标准容器(比如std::vector)不能直接存储引用,因为引用不支持默认构造和赋值操作,这是容器元素的必备要求。所以你改用std::reference_wrapper是完全正确的思路,但你的实现里有两个关键错误导致编译失败:
你的代码里的核心问题
1. StockPriceFunction::GetInnerReference的错误
看这段代码:
std::vector<std::reference_wrapper<valuationFunction>> StockPriceFunction::GetInnerReference() { std::vector<std::reference_wrapper<valuationFunction>> innerVector(1); innerVector.push_back(std::ref(*this)); return innerVector; }
innerVector(1)会尝试创建一个包含**1个默认构造的std::reference_wrapper**的容器,但std::reference_wrapper是不能默认构造的——它必须从一开始就绑定到一个有效的对象。这行代码直接触发编译错误,而且就算能编译,最后你的vector会有2个元素,第一个还是无效的。
2. FunctionCombiner::GetInnerReference的错误
同样的问题:
std::vector<std::reference_wrapper<valuationFunction>> FunctionCombiner::GetInnerReference() { std::vector<std::reference_wrapper<valuationFunction>> innerVector(Inner.size()); // ... 后续插入逻辑 }
innerVector(Inner.size())试图创建Inner.size()个默认构造的reference_wrapper,这同样违反了reference_wrapper的构造规则,直接导致编译失败。
修正后的正确实现
对于StockPriceFunction
直接创建空容器,再添加有效引用,或者用初始化列表更简洁:
std::vector<std::reference_wrapper<valuationFunction>> StockPriceFunction::GetInnerReference() { // 方式1:空容器+push_back std::vector<std::reference_wrapper<valuationFunction>> innerVector; innerVector.push_back(std::ref(*this)); return innerVector; // 方式2:直接用初始化列表(更简洁) // return {std::ref(*this)}; }
对于FunctionCombiner
不要预先分配容器大小,直接创建空容器,遍历Inner集合时把每个子函数的引用列表插入进来:
std::vector<std::reference_wrapper<valuationFunction>> FunctionCombiner::GetInnerReference() { std::vector<std::reference_wrapper<valuationFunction>> innerVector; // 用范围for循环更清晰,避免索引错误 for (const auto& func_ptr : Inner) { auto sub_func_references = func_ptr->GetInnerReference(); innerVector.insert(innerVector.end(), sub_func_references.begin(), sub_func_references.end()); } return innerVector; }
额外注意点
- 确保所有通过
reference_wrapper引用的对象生命周期足够长,不要返回指向临时对象的引用,否则会出现悬垂引用导致未定义行为。 - 如果需要支持const场景,可以额外实现一个
const版本的GetInnerReference,返回std::vector<std::reference_wrapper<const valuationFunction>>。
内容的提问来源于stack exchange,提问作者Oscar
相关产品推荐
相关产品推荐

