У меня есть некоторый шаблонный код для абстракции таймеров на моем устройстве avr. Наиболее важная часть здесь:static_assert всегда вычисляет true (avr, g ++)
template <typename T>
class Timerx8bit
{
T reg;
static_assert(T::res == TimerResolution::bit8, "The timer template is 8bit, registers must also be 8bit");
}
struct Timer0
{
constexpr static const TimerResolution res = TimerResolution::bit16;
volatile uint8_t* tccra = &TCCR0A;
volatile uint8_t* tccrb = &TCCR0B;
//[...]
};
Теперь я подаю Timer0 в шаблон. Проблема с этим кодом заключается в том, что статическое утверждение, кажется, всегда оценивает true, хотя в вышеприведенной ситуации это должно потерпеть неудачу. TimerResolution - это просто класс перечисления.
Проблема, кажется, в шаблоне, если я поставил «TimerResolution :: bit8! = TimerResolution :: bit8» в качестве условия, компиляция завершилась неудачно, как ожидалось, но «T :: res! = T :: res» компилируется без каких-либо проблем ... что мне здесь не хватает?
EDIT: При подготовке полного примера кода, я нашел эту проблему, хотя я до сих пор не совсем понимаю, почему он ведет себя таким образом. Во-первых, код:
enum class TimerResolution_test
{
bit8,
bit16
};
struct Timer0_test
{
constexpr static const TimerResolution_test res = TimerResolution_test::bit8;
};
template <typename T>
class Timerx8bit_test
{
public:
constexpr static const TimerResolution_test res = TimerResolution_test::bit8;
private:
T reg;
static_assert(T::res != T::res, "The timer template is 8bit, registers must also be 8bit");
};
template<typename Timer>
class pwm_test
{
};
Инстанцирование:
pwm_test<Timerx8bit_test<Timer0_test>> testTimer; // Compiles
Timerx8bit_test<Timer0_test> testTimer2; // Fails
Второй конкретизации терпит неудачу с static_assert, как описано выше. Если я ставлю «ложь» вместо шаблонного условия, это не сработает в обоих случаях ... почему? Не должно ли это быть в обоих случаях с исходным шаблоном?
Что такое 'TimerResolution'? Что такое 'TimerResolution :: bit8'? Если возможно, попробуйте создать [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) и покажите нам. –
Невозможно воспроизвести. Я помещаю ваш код в один файл cpp, и когда он скомпилирован, static_assert не работает. –
Три компилятора согласны, поэтому, вероятно, это не ошибка компилятора. Билут Мне трудно представить, что еще может быть. –