I have the following structures that work fine when included in a single main.cpp file. But, when I try to move things to a header.h I get an error.
An example, main.cpp with full definitions (before moved to header.h file):
using namespace std;
static const int nx = 10;
static const int ny = 10;
struct cplx_buffer
{
fftw_complex* a;
int rows;
int cols;
fftw_complex& operator()(int i, int j) const { return a[i * cols + j]; }
};
cplx_buffer my_fftw_allocate_cplx(int x, int y) { return cplx_buffer{ fftw_alloc_complex(x * y), x, y }; }
void print_matrix(cplx_buffer const& m)
{
std::cout << std::fixed << std::setprecision(2);
for (int i = 0; i < m.rows; i++)
{
for (int j = 0; j < m.cols; j++)
{
std::cout << std::setw(16) << std::complex<double> { m(i, j)[0], m(i, j)[1] };
}
std::cout << '\n';
}
std::cout << '\n';
}
int main(){
cplx_buffer outY = my_fftw_allocate_cplx((ny+1), nx);
//stuff
}
Then my attempt of dividing things to header.h, header.cpp, and main.cpp files as the following:
header.h
using namespace std;
static const int nx = 10;
static const int ny = 10;
struct cplx_buffer
{
fftw_complex* a;
int rows;
int cols;
fftw_complex& operator()(int i, int j) const { return a[i * cols + j]; }
};
void print_matrix(cplx_buffer const& m);
cplx_buffer my_fftw_allocate_cplx(int x, int y);
header.cpp looks like:
#include "header.h"
using namespace std;
struct cplx_buffer
{
fftw_complex* a;
int rows;
int cols;
fftw_complex& operator()(int i, int j) const { return a[i * cols + j]; }
};
cplx_buffer my_fftw_allocate_cplx(int x, int y) { return cplx_buffer{ fftw_alloc_complex(x * y), x, y }; } //ERROR
void print_matrix(cplx_buffer const& m)
{
std::cout << std::fixed << std::setprecision(2);
for (int i = 0; i < m.rows; i++)
{
for (int j = 0; j < m.cols; j++)
{
std::cout << std::setw(16) << std::complex<double> { m(i, j)[0], m(i, j)[1] };
}
std::cout << '\n';
}
std::cout << '\n';
}
The Main.cpp is:
#include "header.h"
using namespace std;
int main(){
cplx_buffer outY = my_fftw_allocate_cplx((ny+1), nx);
//stuff
}
The error comes from the header.cpp file in line:
cplx_buffer my_fftw_allocate_cplx(int x, int y) { return cplx_buffer{ fftw_alloc_complex(x * y), x, y }; } //ERROR
The full error message:
cannot overload functions distinguished by return type alone
As someone in the comments suggested, the solution was to only define my struct in the header.h file and not to redefine it again in the header.cpp file.