Context: I am making a switch debouncing wrapper class for InterruptIn called Switch. Switch will allow a user to attach their own function which should be called-back when a real-world switch is pressed and debounced. I'm using Eclipse C++ with the arm-none-eabi-* toolchain.
First off, I found three ways of implementing callbacks with mbed:
- The FunctionPointer class, which is deprecated by ARM, but has some documentation (with broken hyperlinks to information I think I need). 
- Callback<void()>, the compiler informs me this is The Right WayTM to do callbacks when trying to use deprecated FunctionPointer, but no documentation? 
- event_callback_t, no documentation, and the function responsible for calling the user's attached function takes an int as a parameter? 
I'll be using the Callback<void()> way to show the problem I'm having, but all three ways produce the same compile error.
Switch.h:
#ifndef MBED_SWITCH_H
#define MBED_SWITCH_H
#include "mbed.h"
class Switch {
    private:
        Callback<void()> callback_press_;
        InterruptIn switch_;
        //redacted some debouncing stuff
    public:
        Switch(PinName pin, bool isActiveHigh);
        Switch(PinName pin, bool isActiveHigh, int samplePeriod_us, int sampleCount);
        void attachPress(Callback<void()>); //THE PROBLEM FUNCTIONS
        template<typename T, typename F>
        void attachPress(T* object, F function);
};
#endif
Switch.cpp:
#include "Switch.h"
#include "CustomNames.h"
 // redacted constructors here
 //  redacted debouncing functions here
 // for attaching a function not associated with any particular class
void Switch::attachPress(Callback<void()> function) {
    callback_press_.attach(function);
}
 // for attaching a member function of some other class
template<typename T, typename F>
void Switch::attachPress(T* object, F function) {
    callback_press_.attach(object, function);
}
The Problem
Everything compiles, links, and works fine in the real world if I use the first candidate function attachPress(Callback<void()> function) to attach a function not associated with any particular class.
However, when I try to attach a specific member function "testfunc1(void)" of another class "Test" with the second candidate function, I get the following error (from the linker, I think):
Test.o: In function `Test::Test()':
Test.cpp:(.text._ZN4TestC2Ev+0x1e): undefined reference to `void Switch::attachPress<Test, void (Test::*)()>(Test*, void (Test::*)())'
/home/yankee/programming_projects/cpp-eclipse/SO_EXAMPLE/Makefile:97: recipe for target 'HW4_RACE.elf' failed
collect2: error: ld returned 1 exit status
Makefile:21: recipe for target 'all' failed
make[1]: *** [HW4_RACE.elf] Error 1
make: *** [all] Error 2
03:10:35 Build Finished (took 165ms)
Why is this giving me "undefined reference", and is there a way to fix it?
 
    