I'm trying to use a template function, but I get an error
home/guy/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-4-b40a506/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld: sketch/emptyCode.ino.cpp.o: in function `startIOTservices()':
/home/guy/Documents/git/Arduino/HomePi/emptyCode/emptyCode.ino:37: undefined reference to `void myTest::funcOne<bool>(bool)'
/home/guy/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-4-b40a506/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld: sketch/emptyCode.ino.cpp.o: in function `setup':
/home/guy/Documents/git/Arduino/HomePi/emptyCode/emptyCode.ino:70: undefined reference to `void myTest::funcOne<bool>(bool)'
collect2: error: ld returned 1 exit status
exit status 1
Error compiling for board NodeMCU 1.0 (ESP-12E Module).
inside .cpp
file:
myTest::myTest()
{
Serial.println("start");
}
template <class T1>
void myTest::funcOne(T1 arg)
{
Serial.println(arg);
}
inside .h
file:
class myTest
{
public:
myTest();
template <class T1>
void funcOne(T1 arg);
};
and calling it from .ino
file:
testA.funcOne(true);
What am I doing wrong ?
EDIT 1:
complete .h .cpp files - which originaly belongs to myJSON
library which are deleted in this snip
#ifndef myJSON_h
#define myJSON_h
#include "Arduino.h"
#include <ArduinoJson.h>
#include "FS.h"
#define DOC_SIZE 1000
class myJSON
{
};
class myTest
{
public:
myTest();
template <class T1>
void funcOne(T1 arg);
};
#endif
.cpp file
#include "Arduino.h"
#include "myJSON.h"
#include "FS.h"
#include <ArduinoJson.h>
#define LOG_LENGTH 4
myJSON::myJSON(char *filename, bool useserial)
{
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
myTest::myTest()
{
Serial.println("start");
}
// template <typename T1>
void myTest::funcOne(T1 arg)
{
Serial.println(arg);
}
asked Jul 24, 2020 at 5:16
1 Answer 1
move the template method definiton to .h or define it in class. it is not a real function, only a prescription for functions. Like this:
class myTest
{
public:
myTest();
template <class T1>
void funcOne(T1 arg);
};
template <class T1>
void myTest::funcOne(T1 arg)
{
Serial.println(arg);
}
or this
class myTest
{
public:
myTest();
template <class T1>
void funcOne(T1 arg)
{
Serial.println(arg);
}
};
answered Jul 24, 2020 at 7:14
-
Can you please explain what does it differ from what I originaly wrote in my question ?guyd– guyd2020年07月24日 07:17:00 +00:00Commented Jul 24, 2020 at 7:17
-
1the template is a declaration. the source where you use the template can't see it in cpp2020年07月24日 07:18:05 +00:00Commented Jul 24, 2020 at 7:18
-
Actually duplicate the function insde .h file ?guyd– guyd2020年07月24日 07:18:31 +00:00Commented Jul 24, 2020 at 7:18
-
1I write "move". It should be only in .h2020年07月24日 07:18:57 +00:00Commented Jul 24, 2020 at 7:18
-
Compilers don't know which class to use for the templated class if you compile the method separately. The common way is to put the method implementation into the header so the compiler is able to instantiate the specific implementation.the busybee– the busybee2020年07月24日 07:23:05 +00:00Commented Jul 24, 2020 at 7:23
.h
file only I get :error: variable or field 'funcOne' declared void void myTest::funcOne(T1 arg)
myTest
class inside another.cpp
, and.h
files I'm currently using.funcOne
is called duringsetup()
function