当前位置: 首页 > 知识库问答 >
问题:

如何显式实例化没有参数的 func 模板?

訾高飞
2023-03-14

我有一个成员功能模板如下:

using ArgValue_t = std::variant<bool, double, int, std::string>;

struct Argument_t {
    enum Type_e { Bool, Double, Int, String, VALUES_COUNT };

    template<typename T>
    as( const Argument_t& def ) const;

    std::string name;
    ArgValue_t  valu;
    ArgValue_t  maxv;
    ArgValue_t  minv;
    Type_e      type = Int;
    int         prec = 0;
};

// specializing for bool
template<>
bool Argument_t::as<bool>( const Argument_t& def ) const {
    if( static_cast<Type_e>( valu.index() ) != Bool )
        return get<bool>( def.valu );

    return get<bool>( valu );
};

// specializing for double
template<>
double Argument_t::as<double>( const Argument_t& def ) const {
    if( static_cast<Type_e>( valu.index() ) != Double )
        return get<double>( def.valu );

    return min<double>( get<double>( def.maxv ),
                              max<double>( get<double>( def.minv ), get<double>( valu ) ) );
};

// specializing for string
template<>
string Argument_t::as<string>( const Argument_t& def ) const {
    if( static_cast<Type_e>( valu.index() ) != String )
        return get<string>( def.valu );

    return get<string>( valu );
};

// default version for all of integral types
template<typename T>
T Argument_t::as( const Argument_t& def ) const {
    if( static_cast<Type_e>( valu.index() ) != Int )
        return get<T>( def.valu );

    return min<T>( get<T>( def.maxv ),
                        max<T>( get<T>( def.minv ), get<T>( valu ) ) );
};

当我编译它时,我得到了一个链接错误,所以我添加了一些它们的显式实例化。

// there is no problem with these three
template string Argument_t::as<string>( const Argument_t& ) const;
template bool Argument_t::as<bool>( const Argument_t& ) const;
template double Argument_t::as<double>( const Argument_t& ) const;

// but these six can **NOT** be compiled
template int8_t  Argument_t::as<int8_t>( const Argument_t& ) const;
template uint8_t  Argument_t::as<uint8_t>( const Argument_t& ) const;
template int16_t  Argument_t::as<int16_t>( const Argument_t& ) const;
template uint16_t  Argument_t::as<uint16_t>( const Argument_t& ) const;
template int32_t  Argument_t::as<int32_t>( const Argument_t& ) const;
template uint32_t  Argument_t::as<uint32_t>( const Argument_t& ) const;

编译器错误消息

/usr/include/c /9/variant:在“constexpr const _Tp”的实例化中

断言失败:T应该在替代项中只出现一次

我为什么得到这个?如何解决?

共有1个答案

董俊
2023-03-14

我想我找到了答案:

类型<code>ArgValue_t</code>是模板<code>std::variant</code>的一个实例,带有参数:<code>bool/double/int/std::string</code>,但不带有<code>int8_t/uint8_。

我可以抱怨gcc的消息吗?至少它可能会警告我get()的模板参数不正确?

 类似资料:
  • 根据我的尝试和错误,答案似乎是否定的,这是一个简单的 将为班上的所有成员工作。然而,我读过的代码建议不是这样,如果能给出具体的答案,我将不胜感激。

  • 本文向大家介绍Scala没有参数的实例化类:{} vs(),包括了Scala没有参数的实例化类:{} vs()的使用技巧和注意事项,需要的朋友参考一下 示例 假设我们有一个MyClass类,没有构造函数参数: 在Scala中,我们可以使用以下语法实例化它: 或者我们可以简单地写: 但是,如果不注意,在某些情况下,可选的括号可能会产生某些意外的行为。假设我们要创建一个任务,该任务应在单独的线程中运行

  • 例1 如前所述,上面的编译和链接没有问题。然而,在实际应用程序中,我有许多函数模板和许多枚举成员。因此,我试图通过将成员分组到一个新类中来使我的生活变得更轻松,这个类本身依赖于模板参数,并为每个枚举值显式地实例化该类。 例2 编辑:用户2B-T通过https://www.onlinegdb.com/hygr7w0fv_提供了这些示例,供人们进行实验。

  • 我正在从事一个C语言的项目,当我显式实例化模板类时,很难理解模板类的哪些成员被显式实例化。我编写了以下文件,然后使用Visual C 2008 Express Edition的发布配置编译该文件,然后将其放入反汇编程序。 忽略这个文件目前并不真正需要模板,这可以很好地编译。我将exe放入反汇编程序,它告诉我该测试 这导致测试

  • 问题内容: 由于引入了泛型,因此对Class进行了参数化,因此List.class生成Class 。这很清楚。 我无法弄清楚的是如何获取本身已参数化的Class类型的实例,即Class >。像下面的代码片段一样: 我经常遇到这个问题的变种,但我仍然不知道,是否只是想念一些东西,或者真的没有更好的方法。感谢您的建议。 问题答案: Class类是一种类型的运行时表示。由于参数化类型在运行时会进行类型擦

  • [dcl.spec.auto]/14国[强调我的]: 显式实例化声明不会导致使用占位符类型声明的实体的实例化,但也不会阻止根据需要对该实体进行实例化以确定其类型。[示例: -结束示例] 和[temp.explicat]/11声明[强调我的]: 现在,考虑我们是否在类模板中的friend声明中定义了friend函数: 如果在同一翻译单元中实例化了的多个专门化,则将违反[basic.def.odr]/