Итак, я пытаюсь использовать политику, которая, в свою очередь, имеет нетипизированную функцию. У компилятора возникли проблемы с выяснением того, что я пытаюсь сделать.
Например, одна политика выглядит так:
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.
Заранее спасибо!
Вам необходимо устранить неоднозначность вызова шаблона вложенной функции, вставив 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&.
Других решений пока нет …