2013-08-16 2 views
3

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

Например, одна политика выглядит следующим образом:

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, а также политика в отношении адвокатов:

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.

Заранее благодарен!

ответ

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.

+0

Спасибо! Является ли это функцией C++ 11? – user2030743

+1

@ user2030743 Нет, это относится и к C++ 98. Но правила немного изменились для C++ 11 (проверьте связанный ответ). В любом случае, почти все, кто использует шаблоны продвинутым способом, вероятно, были укушены этим, если только им не повезло, чтобы сначала прочитать об этом. Этот вопрос появляется здесь время от времени, потому что сообщения об ошибках являются заведомо загадочными, поэтому маловероятно, что поисковая система найдет вам быстрое решение :-) – TemplateRex

+0

Хех. Спасибо TemplateRex за борьбу с хорошим поединком :) – user2030743

Смежные вопросы