【问题标题】:C++ template with float arguments [duplicate]带有浮点参数的 C++ 模板 [重复]
【发布时间】:2013-01-10 20:09:18
【问题描述】:

可能重复:
C++: Why can’t I use float value as a template parameter?

我有这门课:

template<typename ValueType, ValueType DefaultValue>
class SomeClass
{
    public:
        SomeClass() : m_value(DefaultValue){}

        ValueType m_value;
};

我想这样使用它:

SomeClass<int, 1> intObj; //ok
SomeClass<float, 1.f> floatObj; //error: 'float' : illegal type for non-type template parameter 'DefaultValue'

您能否解释一下为什么在使用float 时会出现此错误?

我想使用类似的东西来表示 RGBA 颜色并使用默认值初始化通道以用于不同的颜色表示(例如白色)。

【问题讨论】:

  • 简短的回答是标准不允许这样做。
  • @K-ballo 是的,这是同一个问题。请关闭:)
  • @Felics:我已经投票关闭它,等待另外 4 票...
  • @K-ballo 我已经投票了:) +3
  • 该副本非常方便说明原因以及解决方法。

标签: c++ templates


【解决方案1】:

该语言不允许使用浮点类型作为非类型模板参数。有关广泛讨论,请参阅Why can't I use float value as a template parameter?

【讨论】:

    【解决方案2】:

    § 14.1/7 (C++11 N3485) 明确禁止这样做:

    不应将非类型模板参数声明为具有浮点、类或 void 类型。 [示例:

    template<double d> class X; // error  
    template<double* pd> class Y; // OK  
    template<double& rd> class Z; // OK
    

    【讨论】:

      【解决方案3】:

      很遗憾,C++ 不支持浮点非类型模板参数。

      【讨论】:

        【解决方案4】:

        您收到该错误是因为 非类型模板参数 不能是 float 类型。它们只能是积分枚举成员指针地址

        【讨论】:

          【解决方案5】:

          这很简单:非类型模板参数必须是整数类型或指针类型的编译时常量,即 bool、枚举、指针、指向成员的指针、long、int、short、char。当前标准中不允许使用浮点参数。

          【讨论】:

          • 它们也可以是枚举
          • 在您发表评论时补充说 ;)
          猜你喜欢
          • 2013-02-12
          • 1970-01-01
          • 2019-09-06
          • 2013-09-13
          • 2011-05-06
          • 1970-01-01
          • 1970-01-01
          • 2015-04-02
          • 1970-01-01
          相关资源
          最近更新 更多