c++ - function ... has already a body & function template has already been defined -
i have header file:
utility.h:
#pragma once #include <fstream> #include <iostream> #include <string> #include <vector> #include <windows.h> using namespace std; template<std::size_t> struct int_ {}; template <class tuple, size_t pos> std::ostream& print_tuple(std::ostream& out, const tuple& t, int_<pos>); struct timer { public: timer(); void start(); double getmillisec(); private: large_integer frequency; // ticks per second large_integer t1, t2; // ticks }; //... #include "utility.cpp" and implementation file:
utility.cpp:
#include "utility.h" template <class tuple, size_t pos> std::ostream& print_tuple(std::ostream& out, const tuple& t, int_<pos>) { ... } timer::timer() { // ticks per second queryperformancefrequency(&frequency); } void timer::start() { queryperformancecounter(&t1); } double timer::getmillisec() { queryperformancecounter(&t2); return (t2.quadpart - t1.quadpart) * 1000.0 / frequency.quadpart; } which returns error:
error c2995: 'std::ostream &print_tuple(std::ostream &,const tuple &,int_<pos>)': function template has been defined error c2084: function 'timer::timer(void)' has body ... the problem not guards (as suggested in this question) since use #pragma once
i`ve read of implementing .tpp files template class implementation, find horrible solution, since visual studio format nothing file.
trying define utility.tpp: (wrong solution)
so substituted #include "utility.cpp #include "utility.tpp in utility.h , define...
utility.tpp
timer::timer() { // ticks per second queryperformancefrequency(&frequency); } void timer::start() { queryperformancecounter(&t1); } double timer::getmillisec() { queryperformancecounter(&t2); return (t2.quadpart - t1.quadpart) * 1000.0 / frequency.quadpart; } and error returned is:
1>memoization.obj : error lnk2005: "public: __cdecl timer::timer(void)" (??0timer@@qeaa@xz) defined in helloworld.obj ... this main btw:
helloworld.cpp:
#include <algorithm> #include <stdio.h> #include <stdlib.h> #include <time.h> //#include "memoization.cpp" #include<vector> #include"utility.h" using namespace std; int main() { } trying define utility.tpp: (right solution, finally)
as in comment made me notice, idiot imported time methods in .tpp file, , should have imported templates function, , in utility.tpp contains print_tuple while utility.cpp contains 3 timer functions.
if going include cpp file header file need exclude cpp file compiling in project. if not header file have cpp file has , when compiler compiles cpp file object have 2 copies of of definitions. 1 in header file has copy of cpp file in , 1 in cpp file compiled. leads redefinition errors.
once remove utility.cpp being compiled other cpp file includes utility.h have copy full source since utility.cpp included.
to remove utility.cpp compiling see: how exclude files visual studio compile?
if reason using cpp file because tpp files not format c++ code c++ can configure msvs treat tpp files c++ files. if go tools -> options -> text editor -> file extensions can add file extension formatting. enter extension in extension box, select microsoft visual c++ editor drop down , click add.
now can use tpp file instead of cpp file , not have remember exclude cpp file build. conform modern practices.
Comments
Post a Comment