Цитата(grau @ Feb 18 2008, 11:54)

Для начала считаю необходимым заметить, что приводил пример с классами, а не с функциями, с которыми все немного по-другому. Ну а если конкретнее, то мне всегда казалось, что параметризируется только тип аргумента функции, но никак не внутренние переменные. Иначе как ее вообще объявлять?
Прошу прощения, я сморозил глупость. Все-таки я вначале расписал класс, потом из-за ошибок компиляции начал поочередно все откидывать, потом по старой русской традиции решил все-таки заглянуть в EVAVR_CompilerReference.pdf. вот что я там нашел (цитирую):
Цитата
Non-type template parameters
It is allowed to have a reference to a memory type as a template parameter, even if
pointers to that memory type are not allowed.
Example
extern int __io x;
template<__io int &y>
void foo()
{
y = 17;
}
void bar()
{
foo<x>();
}
Пробую этот кусок - та же ошибка. Поэтому и в своем посте я изобразил подобное.
Но вот вырезка из моего класса:
Код
typedef uint8_t volatile __tiny IO_REG;
template <IO_REG &UDR, IO_REG &UBRRH, IO_REG &UBRRL>
class CBaseUart
{
private:
enum
{
DEFAULT_BAUDRATE = 115200,
};
public:
CBaseUart(uint32_t baudRate=DEFAULT_BAUDRATE)
{
uint16_t tmp_baud = CPU_CLK_Hz / (16 * baudRate) - 1;
UBRRH = (uint8_t)(tmp_baud >> 8);
UBRRL = (uint8_t)tmp_baud;
}
virtual ~CBaseUart();
inline void transmit(uint8_t data)
{
UDR = data;
}
};
Вот так я пытаюсь использовать:
Код
int main()
{
CBaseUart <UDR0, UBRR0H, UBRR0L> uart;
uart.transmit(0x55);
return 0;
}
Опять та же ошибка. Обидно