用于策略功能的非类型模板

时间:2013-08-16 18:07:51

标签: c++ templates policy disambiguation

所以,我试图使用一个策略,而该策略又具有非类型的模板化函数。编译器在解决我想要做的事情时遇到了一些问题。

例如,一个政策如下:

template <int unsigned NBits> struct Foo {

/* Internal data type that provides NBits of storage */
typedef int unsigned DataType; // for  example

/* Accessor */
template <int unsigned QueryBit>
bool const IsBitSet(DataType const &) const { /* ... */ }

};

另一个策略使用此策略对设置的位执行一系列操作:

template <typename FooPolicy> struct DoBar_WithFoo {

FooPolicy FooPolicy_;

bool const XOR_SpecificBits(FooPolicy::DataType const &Data) const {
  // Error listed below points to this line
  return FooPolicy_.IsBitSet<10>(Data) ^ FooPolicy_.IsBitSet<8>(Data) /* ... */ ;
}

};

用户类需要Foo策略以及Bar策略:

template<typename FooPolicy, typename DoBar_Policy> struct UserClass {

  // Use FooPolicy for data

  void MyFunction() {
    // Use DoBar_Policy to manipulate data
  }
};

用户将上述两者结合起来如下:

typedef Foo<12> Foo_12Bits_type;
typedef DoBar_WithFoo<Foo_12Bits_Type> Bar_type;

typedef UserCLass<Foo_12Bits_type, Bar_type> MyUserClass;

MyUserClass.MyFunction();

我收到如下错误:

error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator<'

此错误指向以下代码位(如上所述):

/* ... */ FooPolicy_.IsBitSet<10>(Data) /* ... */

我可以从中推断出&lt; 10&gt;看起来像是一个比较操作。但是,我真的要求编译器专门化策略中包含的模板函数。

我可以这样做吗?我该怎么做呢?

如果有人想知道,我正在尝试写一个LFSR。我希望将来转移到不同的底层数据类型,并保持用于生成LFSR的特定多项式与用于存储和操作LFSR位的数据类型和操作分开。

提前致谢!

1 个答案:

答案 0 :(得分:2)

您需要通过在成员姓名之前插入template关键字来消除对嵌套函数模板的调用的歧义:

bool const XOR_SpecificBits(FooPolicy::DataType const &Data) const {
  // Error listed below points to this line
  return FooPolicy_.template IsBitSet<10>(Data) ^ FooPolicy_.template IsBitSet<8>(Data) /* ... */ ;
                    ^^^^^^^^                                 ^^^^^^^^
}

为什么要这样做,请参阅this famous Q&A