Предупреждение компилятора о шаблоне - PullRequest
4 голосов
/ 17 февраля 2012
 1  #include <cstdlib>
 2  #include <iostream>
 3
 4  enum { SIZE_PER_CHUNK = ((1<<16) / sizeof(unsigned)) };
 5 
 6  class TrueType {} ;
 7  class FalseType {} ;
 8
 9  template< std::size_t V, bool B = (((V) & ((V) - 1)) == 0) > class IsPowerOfTwo_;
10  template< std::size_t V >   class IsPowerOfTwo_< V, true  > : public TrueType {};
11  template< std::size_t V >   class IsPowerOfTwo_< V, false > : public FalseType {};
12  
13  typedef IsPowerOfTwo_< SIZE_PER_CHUNK >   IsPowerOfTwo;  
14
15
16  int main() {
17     IsPowerOfTwo p2;
18     
19     std::cout << "Hello World!" << std::endl;
20     return 0;
21  }

Следующий код выдает предупреждение компилятора (gcc 4.6.2, /project/dfttools/compile/lnx-x86/gcc-4.6.2):

предупреждение: предложить скобки вокруг «-» в операнде «&» [-Wparentheses]

Предупреждение указывает на строку 13, но, вероятно, оно связано с выражением в строке 9.

Есть решение?

1 Ответ

1 голос
/ 17 февраля 2012

Похоже, ошибка компилятора для меня.Это как если бы компилятор удалял ненужные скобки из значения по умолчанию B и затем вызывал само предупреждение.

Обходной путь:

template<size_t V> struct IsPowerOfTwo_Helper
{
    enum { value = V & (V - 1) };
};

template< std::size_t V, bool B = IsPowerOfTwo_Helper<V>::value == 0 > class IsPowerOfTwo_;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...