Hi all,
OS - MacOS X 10.4.9
Compiler - gcc 4.0 (XCode)
I'm *extremely* new to C++ (but have extensive experience with Java),
so please go easy on me.
I'm running into a very odd situation which I believe is related to
template instantiation. I need to include a header file from a library
what includes a template implementation (.cpp) file in which the ==
operator is overloaded. If I include this header file, my application
won't link and gives me the following three errors:
/usr/bin/ld: Undefined symbols:
int operator==<OpenMesh::FaceHandle>(OpenMesh::FaceHan dle const&,
OpenMesh::FaceHandle const&)
int operator==<OpenMesh::VertexHandle>(OpenMesh::Verte xHandle const&,
OpenMesh::VertexHandle const&)
int operator!=<OpenMesh::HalfedgeHandle>(OpenMesh::Hal fedgeHandle
const&, OpenMesh::HalfedgeHandle const&)
The weird part is that the OpenMesh::FaceHandle, VertexHandle, etc.
classes are data structures from a totally separate library. They are
members of the myMesh object (which is also a specialization of a
template) in the main.cpp program.
It seems like for some reason, the linker is looking for an
overloading of the == and != operators that returns int (as defined in
the GA1DArray.h template). The source code for the header which causes
the problem and the main file in which it's included are below. I
apologize for how complicated this code is, but I'm using a couple
different libraries, and it's hard to explain everything briefly.
Lastly, one important bit of information: this code COMPILES AND LINKS
FINE W/ MSVC++ 7.0
Thanks
Aaron
---------
---GAArray.h (Actual included header is ga.h which includes a header
which includes the implementation of a ---template the extends
GAArray, but GAArray has the overload of the operator in question, ==
returning int)
#ifndef _ga_arraytmpl_h_
#define _ga_arraytmpl_h_
template <class T>
class GAArray {
public:
GAArray(unsigned int s) : sz(s), a(sz ? new T[sz] : 0)
{for(unsigned int i=0; i<sz; i++) a[i] = (T)0; }
GAArray(const GAArray<T& orig){sz=0; a=(T *)0; copy(orig);}
GAArray<T& operator=(const GAArray<T& orig){copy(orig); return
*this;}
GAArray<T& operator=(const T array []) // no err checks!
{for(unsigned int i=0; i<sz; i++) a[i] = *(array+i); return
*this;}
virtual ~GAArray(){delete [] a;}
GAArray<T* clone(){return new GAArray<T>(*this);}
operator const T * () const {return a;}
operator T * () {return a;}
const T & operator[](unsigned int i) const {return a[i];}
T & operator[](unsigned int i) {return a[i];}
void copy(const GAArray<T& orig){
size(orig.sz);
for(unsigned int i=0; i<sz; i++)
a[i] = orig.a[i];
}
void copy(const GAArray<T& orig, unsigned int dest,
unsigned int src, unsigned int length){
for(unsigned int i=0; i<length; i++) a[dest+i] = orig.a[src+i];
}
void move(unsigned int dest, unsigned int src, unsigned int length){
if(src dest)
for(unsigned int i=0; i<length; i++) a[dest+i] = a[src+i];
else if(src < dest)
for(unsigned int i=length-1; i!=0; i--) a[dest+i] = a[src+i];
}
void swap(unsigned int i, unsigned int j){T tmp=a[j]; a[j]=a[i];
a[i]=tmp;}
int size() const {return sz;}
int size(unsigned int n){
if(n == sz) return sz;
T * tmp = (n ? new T[n] : 0);
for(int i=((n < sz) ? n-1 : sz-1); i>=0; i--) tmp[i] = a[i];
delete [] a;
a = tmp;
return sz=n;
}
int equal(const GAArray<T& b,
unsigned int dest, unsigned int src, unsigned int length) const {
for(unsigned int i=0; i<length; i++)
if(a[dest+i] != b.a[src+i]) return 0;
return 1;
}
protected:
unsigned int sz; // number of elements
T * a; // the contents of the array
};
template <class Tint
operator==(const GAArray<T& a, const GAArray<T& b){
if(a.size() != b.size()) return 0;
return a.equal(b,0,0,a.sz);
}
template <class Tint
operator!=(const GAArray<T& a, const GAArray<T& b){
if(a.size() != b.size()) return 1;
return a.equal(b,0,0,a.sz) ? 0 : 1;
}
#endif
---------main.cpp------------
#include "MeshObject.h"
#include "ga/ga.h"
Mesh myMesh;
int main(int argc, char **argv)
{
OpenMesh::IO::read_mesh(myMesh, "simple.off");
return 0;
} 1 2735 am****@gmail.com wrote:
Hi all,
OS - MacOS X 10.4.9
Compiler - gcc 4.0 (XCode)
I'm *extremely* new to C++ (but have extensive experience with Java),
so please go easy on me.
I'm running into a very odd situation which I believe is related to
template instantiation. I need to include a header file from a library
what includes a template implementation (.cpp) file in which the ==
operator is overloaded. If I include this header file, my application
won't link and gives me the following three errors:
/usr/bin/ld: Undefined symbols:
int operator==<OpenMesh::FaceHandle>(OpenMesh::FaceHan dle const&,
OpenMesh::FaceHandle const&)
int operator==<OpenMesh::VertexHandle>(OpenMesh::Verte xHandle const&,
OpenMesh::VertexHandle const&)
int operator!=<OpenMesh::HalfedgeHandle>(OpenMesh::Hal fedgeHandle
const&, OpenMesh::HalfedgeHandle const&)
Why do these return int rather than bool?
The weird part is that the OpenMesh::FaceHandle, VertexHandle, etc.
classes are data structures from a totally separate library. They are
members of the myMesh object (which is also a specialization of a
template) in the main.cpp program.
Your code doesn't define these operators, are you sure the library does?
--
Ian Collins. This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: william xuuu |
last post by:
Actually, I also got linker errors with template functions and template
classes. And I avoided both of them successfully, by pouring foo.cpp
into foo.h, according to the C++ FAQ.
...
|
by: tuko |
last post by:
The following snipet gives a linker error.
I don't get it...
template<class T> class tran {
public:
public:
private:
};
template<class T> class matrix {
|
by: Fei Liu |
last post by:
Hi, I have a interesting problem here,
class absOP{
template<class T> T operator(T val) { return val < 0 ? -val : val; }
};
Now the problem is I can't seem to use this overloaded operator,
...
|
by: atomik.fungus |
last post by:
Hi, as many others im making my own matrix class, but the compiler is
giving me a lot of errors related to the friend functions which
overload >> and <<.I've looked around and no one seems to get...
|
by: merdem |
last post by:
Hi all,
I just started to mess around with templates. First I declared a class
Image as follows(this is a small version of the real thing which is
pretty big):
template<int depth, int space,...
|
by: Hamilton Woods |
last post by:
Diehards,
I developed a template matrix class back around 1992 using Borland C++ 4.5
(ancestor of C++ Builder) and haven't touched it until a few days ago. I
pulled it from the freezer and...
|
by: Wayne Shu |
last post by:
Hi, guys
I am reading Vandevoorde and Josuttis 's "C++ Template The Complete
Guide" these days.
When I read the chapter 15: Traits and Policy classes.
I copy the code in 15.2.2 that use to...
|
by: syang8 |
last post by:
Dear all,
I am trying to design classes with stream support. Basically, I want
the operator << work for the base class and all the derived classes.
If the base class is a template class, and...
|
by: 2beagles |
last post by:
I have a template for a three dimensional array that I have been working on using Visual C++ 6.0. Under version 6 this code worked fine. However, last night I downloaded Visual C++ 2005 Express and...
|
by: Faith0G |
last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome former...
|
by: taylorcarr |
last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
|
by: aa123db |
last post by:
Variable and constants
Use var or let for variables and const fror constants.
Var foo ='bar';
Let foo ='bar';const baz ='bar';
Functions
function $name$ ($parameters$) {
}
...
|
by: ryjfgjl |
last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
|
by: ryjfgjl |
last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
|
by: emmanuelkatto |
last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud.
Please let me know.
Thanks!
Emmanuel
|
by: nemocccc |
last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
|
by: Hystou |
last post by:
There are some requirements for setting up RAID:
1. The motherboard and BIOS support RAID configuration.
2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
| |