Нетипичные шаблоны для функций политики

Итак, я пытаюсь использовать политику, которая, в свою очередь, имеет нетипизированную функцию. У компилятора возникли проблемы с выяснением того, что я пытаюсь сделать.

Например, одна политика выглядит так:

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) /* ... */

Из этого я могу сделать вывод, что <10> выглядит как операция сравнения. Но я действительно прошу компилятор специализировать функцию шаблона, содержащуюся в политике.

Я могу это сделать? Как мне это сделать?

Если кому-то интересно, я пытаюсь написать LFSR. В будущем я хотел бы перейти к другому базовому типу данных, а также оставить отдельный многочлен, используемый для генерации LFSR, отдельно от типа данных и операций, используемых для хранения и манипулирования битами LFSR.

Заранее спасибо!

3

Решение

Вам необходимо устранить неоднозначность вызова шаблона вложенной функции, вставив 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) /* ... */ ;
^^^^^^^^                                 ^^^^^^^^
}

Почему это нужно сделать, см. этот знаменитый Q&.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]