【问题标题】:Type un-erasure from a boost::program_options value [duplicate]从 boost::program_options 值中键入 un-erasure [重复]
【发布时间】:2015-11-20 17:21:01
【问题描述】:

我正在尝试使用boost::program_options 改进我的程序。除其他外,我编写了一个无法编译的函数。这是一个编译失败的最小 .cpp 文件:

#include <boost/program_options.hpp>

template <typename C, typename E>
inline bool contains(const C& container, const E& element) {
    return container.find(element) != container.end();
}

template <typename K, typename V>
V& updateFromConfig(V& updatee, const K& key, const po::variables_map& vm) {
    if (contains(vm, key)) {
        // option 1
        updatee = vm[key];
        // option 2
        //updatee = vm[key].variable_value();
        // option 3
        // updatee = vm[key].as<V>();
        // option 4
        // updatee = vm[key].as();
    }
    return updatee;
}

template size_t& updateFromConfig<char*,size_t>(size_t& updatee, char* const& key, const po::variables_map& vm);

使用四个选项中的任何一个,我都会得到不同的编译器错误:

  • 使用选项 1:

    cannot convert ‘const boost::program_options::variable_value’ to ‘long unsigned int’ in assignment
       updatee = vm[key];
    
  • 使用选项 2:

    invalid use of ‘boost::program_options::variable_value::variable_value’
    
  • 使用选项 3:

    18:25: error: expected primary-expression before ‘>’ token
    18:27: error: expected primary-expression before ‘)’ token
    
  • 使用选项 4:

    no matching function for call to ‘boost::program_options::variable_value::as() const
    

我做错了什么?

【问题讨论】:

标签: c++ templates boost-program-options boost-any


【解决方案1】:

win 的 C++ 语法。 Do:

updatee = vm[key].template as<V>();

【讨论】:

  • 说明为什么需要这个模板消歧器可能有助于 OP。或者我可以只是 Mjölnir OP 的描述......
  • 真的吗?这太奇怪了……我怎么能把“模板”放在语句的中间?你能不能链接到某个地方来解释这是怎么可能的?我知道类型之前的“typename”,但这对我来说是新的。
  • @einpoklum 立即查看您的问题上的duplicate 指针。它解释了......很多细节。
  • @Yakk 嗯?但是as 不是从属名称...vm 不是模板参数,operator[] 也不是函数模板。为什么template 关键字很重要?
  • @Barry [temp.dep.expr]/1 “除非下面描述,如果任何子表达式依赖于类型,则表达式依赖于类型。”所以,vm[k] 是一个依赖表达式,除非被排除在外。没有任何排除项适用(事实上,只有一个可能的 operator[] 重载可以被调用,这一事实未列为排除项)。一旦依赖,vm[k].as 被假定为不是模板,除非已消除歧义。病毒类型依赖的例外主要是 static_castsizeofnew 等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-30
  • 1970-01-01
  • 1970-01-01
  • 2020-08-29
相关资源
最近更新 更多