I'm doing this example that involves two generic functions, one that takes a vector of type T and another that takes an array of type T. The functions worked when I put both the declaration and definition within main, but when I split them up between the header file and implementation I get an undefined reference to the functions when I call them from main.
Code:
//main.cpp
#include <cstdlib>
#include <iostream>
#include <vector>
#include "headers.h"
using std::vector;
using std::cout;
using std::endl;
int main()
{
int a_grades[8] = {87, 95, 100, 83, 75, 49, 56, 94};
vector<int> v_grades(a_grades, a_grades + 9);
cout << median(a_grades) << endl;
cout << median(v_grades) << endl;
//49 56 75 83 87 94 95 100
system("PAUSE");
return EXIT_SUCCESS;
}
Code:
//headers.h
#ifndef headers_h
#define headers_h
#include <vector>
template <class T> double median(std::vector<T> vec);
template <class T> double median(T vec);
#endif
Code:
//headers.cpp
#include <iostream>
#include <vector>
#include <stdexcept>
#include <cstddef>
#include "headers.h"
using std::vector;
template <class T> double median(vector<T> vec)
{
typedef typename vector<T>::size_type vec_sz;
vec_sz size = vec.size();
if (size == 0)
throw std::domain_error("median of an empty vector");
std::sort(vec.begin(), vec.end());
vec_sz mid = size/2;
return size % 2 == 0 ? (vec[mid] + vec[mid-1]) / 2 : vec[mid];
}
template <class T> double median(T vec)
{
size_t size = sizeof(vec)/sizeof(*vec);
if (size == 0)
throw std::domain_error("median of an empty vector");
std::sort(vec, vec + size);
size_t mid = size/2;
return size % 2 == 0 ? (vec[mid] + vec[mid-1]) / 2 : vec[mid];
}
errors
Code:
In function `main':
[Linker error] undefined reference to `double median<int*>(int*)'
[Linker error] undefined reference to `double median<int>(std::vector<int, std::allocator<int> >)'
ld returned 1 exit status
[Build Error] [practice.exe] Error 1