2013-02-25 2 views
3

Этого код:специализированные конструкторы шаблона не видели, как конструкторы

constexpr uint32_t ticksPerSecond = 100000; 

struct ticks { 
    uint32_t count; 
    template<typename integer> 
    constexpr explicit ticks(integer c) : count(c) { } 
    explicit inline operator float() { 
     return count/(float) ticksPerSecond; 
    } 
}; 

template<> 
constexpr explicit ticks::ticks<float>(float s) : count(s * ticksPerSecond) { } 

дает мне ошибку:

timer.hpp:(last line of snippet): 
error: only declarations of constructors can be 'explicit' 

Конечно ticks::ticksявляется конструктора?

+0

Возможно, вам следует удалить ключевое слово 'constexpr'? – Axel

+3

После того, как вы решите свою проблему и ее компилируете, подумайте об изменении кода. Специализация шаблонов функций обычно не является лучшей идеей. Вы должны предпочесть не templated перегрузку. –

+0

@ DavidRodríguez-dribeas: Вы говорите, что я могу просто объявить не шаблонную версию конструктора, и это займет приоритет над версией шаблона? – Eric

ответ

11

Сообщение об ошибке довольно ясно, вы можете использовать только explicit в объявлениях (не в определениях). Просто удалите это ключевое слово из специализации:

template<> 
constexpr ticks::ticks<float>(float s) : count(s * ticksPerSecond) { } 
+0

Darn, я читал его как _ "только объявления __конструкторов __" _, а не _ "только __declarations__ конструкторов" _ – Eric

+0

Вы должны прочитать это как '** только декларации конструкторов **' ;-) –

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