I'm having a problem with the following scheme. If everything is in one source file, it compiles and links fine:

Code:
#include <iostream>

enum Type {TYPE_A, TYPE_B};

class Test
{
    public:
    template <Type N>
    void foo();
    
    void a();
    void b();
};

void Test::a()
{
    std::cout << "A\n";
}

void Test::b()
{
    std::cout << "B\n";
}

template <>
void Test::foo<TYPE_A>()
{
    a();
}

template <>
void Test::foo<TYPE_B>()
{
    b();
}

int main()
{
    Test t;
    t.foo<TYPE_A>();
    t.foo<TYPE_B>();
    std::cin.get();
}
However, when I try to break this up into multiple files (as follows), I get multiple definition of Test::foo<>. What am I missing?

Code:
//type.h
#ifndef TYPE_H
#define TYPE_H

enum Type {TYPE_A, TYPE_B};
#endif

//test.h
#ifndef TEST_H
#define TEST_H

#include "type.h"

class Test
{
    public:
    template <Type N>
    void foo();
    
    void a();
    void b();
};
#include "foo.cpp"
#endif

//test.cpp
#include "test.h"
#include <iostream>

void Test::a()
{
    std::cout << "A\n";
}

void Test::b()
{
    std::cout << "B\n";
}

//foo.cpp
template <>
void Test::foo<TYPE_A>()
{
    a();
}

template <>
void Test::foo<TYPE_B>()
{
    b();
}

//main.cpp
#include "test.h"
#include "type.h"
#include <iostream>
int main()
{
    Test t;
    t.foo<TYPE_A>();
    t.foo<TYPE_B>();
    std::cin.get();
}
(foo.cpp is not compiled separately.)