реклама на сайте
подробности

 
 
> WinAVR, G++, template, linking, Помогите найти ошибку при применении template.
Igor_U
сообщение Jun 9 2006, 06:10
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 34
Регистрация: 2-10-05
Пользователь №: 9 141



Не понимаю. Где может быть ошибка при использовании template? Без использования template проект собирается нормально. Проект состоит из 3 фалов main.cpp - откуда вызываю функцию Func, clMy.h - где объявляю класс clMy, и clMy.cpp - где описана реализация функции Func. Вот как это выглядит:
main.cpp
Код
#include <avr/io.h>
#include "clMy.h"

int main(void)
{
clMy My;
volatile uint8_t d=My.Func(3);
for(;;);
return (0);
};

clMy.h
Код
#include <avr/io.h>
#ifndef _clMy_
#define _clMy_

class clMy
{
private:
    uint8_t massiv[count];
public:
    uint8_t Func(uint8_t);
};

#endif

clMy.cpp
Код
#include "clMy.h"

uint8_t clMy::Func(uint8_t temp)
{
return(massiv[temp]);
}


Это все собирается правильно. Но как только хочу использовать template проект собираться перестает. Линковщик ругается, что не определена ссылка на Func. Видимо что-то неправильно делаю, но что? С плюсами еще только знакомлюсь. Помогите.
main.cpp
Код
#include <avr/io.h>
#include "clMy.h"

int main(void)
{
clMy<4> My;
volatile uint8_t d=My.Func(3);
for(;;);
return (0);
};

clMy.h
Код
#include <avr/io.h>
#ifndef _clMy_
#define _clMy_

template <uint8_t count>class clMy
{
private:
    uint8_t massiv[count];
public:
    uint8_t Func(uint8_t);
};

#endif

clMy.cpp
Код
#include "clMy.h"

template <uint8_t count>uint8_t clMy<count>::Func(uint8_t temp)
{
return(massiv[temp]);
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Igor_U
сообщение Jun 9 2006, 07:37
Сообщение #2


Участник
*

Группа: Новичок
Сообщений: 34
Регистрация: 2-10-05
Пользователь №: 9 141



Спасибо за ответ. Дело в том, что я только осваиваю плюсы и поэтому еще не знаю всех возможностей. В данном случае я хотел задавать размер массива, тип массива всегда одинаков. Размер массива будет использоваться неоднократно в функциях этого класса, поэтому хотелось автоматизации. Можно конечно реализовать это с помощью define, но с template разобраться хотелось бы в любом случае. По-поводу задания интегральных значений с помощью template читал у Страутрупа.
Переписал класс с template задающим тип. Ошибка такая же. Значит что-то делаю не такsad.gif

Код
-----
main.cpp

#include <avr/io.h>
#include "clMy.h"

int main(void)
{
clMy<uint8_t> My;
volatile uint8_t d=My.Func(3);
for(;;);
return (0);
};
-----
clMy.h

#include <avr/io.h>
#ifndef _clMy_
#define _clMy_

template <class T>class clMy
{
private:
    T massiv[4];
public:
    T Func(uint8_t);
};
#endif
-----
clMy.cpp

#include "clMy.h"

template <class T> T clMy<T>::Func(uint8_t temp)
{
return(massiv[temp]);
}


Не собирается, так как опять не определить ссылки:
Код
Compiling: main.cpp
avr-g++ -c -mmcu=at90can128 -I. -gdwarf-2 -DF_CPU=14745600UL  -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wa,-adhlns=main.lst -Ic:\Sourse\Library -std=gnu++98 -MD -MP -MF .dep/main.o.d main.cpp -o main.o
main.cpp: In function `int main()':
main.cpp:8: warning: unused variable 'd'

Compiling: clMy.cpp
avr-g++ -c -mmcu=at90can128 -I. -gdwarf-2 -DF_CPU=14745600UL  -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wa,-adhlns=clMy.lst -Ic:\Sourse\Library -std=gnu++98 -MD -MP -MF .dep/clMy.o.d clMy.cpp -o clMy.o

Linking: main.elf
avr-g++ -mmcu=at90can128 -I. -gdwarf-2 -DF_CPU=14745600UL  -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wa,-adhlns=main.o -Ic:\Sourse\Library -std=gnu++98 -MD -MP -MF .dep/main.elf.d main.o clMy.o --output main.elf -Wl,-Map=main.map,--cref    -lm
main.o: In function `main':
c:\sourse\otl/main.cpp:8: undefined reference to `clMy<unsigned char>::Func(unsigned char)'
C:\WinAVR\utils\bin\make.exe: *** [main.elf] Error 1


Может дело в makefile? Вот кусочки makefile:
Код
FORMAT = ihex
TARGET = main
CPPSRC = $(TARGET).cpp clMy.cpp
CPPSTANDARD = -std=gnu++98
CPPFLAGS = -g$(DEBUG)
CPPFLAGS += $(CDEFS) $(CINCS)
CPPFLAGS += -O$(OPT)
CPPFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
CPPFLAGS += -Wall
CPPFLAGS += -Wa,-adhlns=$(<:.cpp=.lst)
CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
CPPFLAGS += $(CPPSTANDARD)
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
LDFLAGS += $(EXTMEMOPTS)
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
CPP = avr-g++
OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
OBJ = $(SRC:.c=.o) $(CPPSRC:.cpp=.o) $(ASRC:.S=.o)
LST = $(SRC:.c=.lst) $(CPPSRC:.cpp=.lst) $(ASRC:.S=.lst)
GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d
ALL_CPPFLAGS = -mmcu=$(MCU) -I. $(CPPFLAGS) $(GENDEPFLAGS)

all: begin gccversion sizebefore build sizeafter end

build: elf hex eep lss sym
elf: $(TARGET).elf
hex: $(TARGET).hex
eep: $(TARGET).eep
lss: $(TARGET).lss
sym: $(TARGET).sym

SECONDARY : $(TARGET).elf
.PRECIOUS : $(OBJ)
%.elf: $(OBJ)
    @echo
    @echo $(MSG_LINKING) $@
    $(CPP) $(ALL_CPPFLAGS) $^ --output $@ $(LDFLAGS)

%.o : %.cpp
    @echo
    @echo $(MSG_COMPILING) $<
    $(CPP) -c $(ALL_CPPFLAGS) $< -o $@
%.s : %.cpp
    $(CPP) -S $(ALL_CPPFLAGS) $< -o $@
%.i : %.cpp
    $(CPP) -E -mmcu=$(MCU) -I. $(CPPFLAGS) $< -o $@
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 08:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01387 секунд с 7
ELECTRONIX ©2004-2016