473,385 Members | 1,347 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,385 software developers and data experts.

class templates with pointers to each other in seperate header files

Ben
I'm kind of new to creating templates. I've made some small class and
function templates in the past and I have used quite of bit of the STL,
but I am having problems tyring to create templates.

I'm trying to make class templates in seperate header files with
pointers to each other, and I am getting strange errors.

Is it possible to do?

May 27 '06 #1
12 2068
Ben
I guess the real problem is the recursive inclusion of the header
files. Is there a workaround?

For non-template classes, I just put the include for one of the headers
in the.cpp file, but I can't do that with templates.

May 27 '06 #2

Ben wrote:
I guess the real problem is the recursive inclusion of the header
files. Is there a workaround?

For non-template classes, I just put the include for one of the headers
in the.cpp file, but I can't do that with templates.


Post a small, self-contained piece of code that illustrates the problem
you're having, along with the error messages you get when you try to
compile. Make sure it is something that we can literally cut&paste and
compile ourselves.

Best regards,

Tom

May 27 '06 #3
Ben wrote:
I'm kind of new to creating templates. I've made some small class and
function templates in the past and I have used quite of bit of the STL,
but I am having problems tyring to create templates.

I'm trying to make class templates in seperate header files with
pointers to each other, and I am getting strange errors.

Is it possible to do?


Of course. Just forward-declare the template:

template <typename> Foo;

template <typename T> class Bar
{
Foo<T> *
};

Luke

May 27 '06 #4
Ben wrote:
I guess the real problem is the recursive inclusion of the header
files. Is there a workaround?
Yes. See the FAQ:
http://www.parashift.com/c++-faq-lite/templates.html
For non-template classes, I just put the include for one of the headers
in the.cpp file, but I can't do that with templates.


It does get a bit hairy in some cases, but there's a way.

Luke

May 27 '06 #5
Ben
Thanks for the help!

My includes are a quite messy right now, so I will see if I can clean
it up, and try some of the stuff in the faq.

May 28 '06 #6
Ben wrote:
Thanks for the help!
Certainly.
My includes are a quite messy right now, so I will see if I can clean
it up, and try some of the stuff in the faq.


It's unfortunate that so many people are taught to add #includes into
headers for everything their class uses. You should only #include what
you absolutely *have to* in a header (most commonly base classes,
by-value members (when not using pimpl), and typedefs), and leave the
rest for the implementation file. This really helps to cut down on
build times and recompilation.

While you're looking at the FAQ, take a peek at the section on posting
etiquette and quoting conventions -- really helps if you indicate what
you're replying to.

Cheers,
Luke

May 28 '06 #7
* Luke Meyers:
Ben wrote:
Thanks for the help!


Certainly.
My includes are a quite messy right now, so I will see if I can clean
it up, and try some of the stuff in the faq.


It's unfortunate that so many people are taught to add #includes into
headers for everything their class uses. You should only #include what
you absolutely *have to* in a header (most commonly base classes,
by-value members (when not using pimpl), and typedefs), and leave the
rest for the implementation file. This really helps to cut down on
build times and recompilation.


On the contrary.

The Microsoft style makes a mess of file dependencies, introduces
#include statement order depends, with associated problems, and often
results in one big mother-of-all include file to ensure that all that's
required is there, in the right order: imposing on all of the code that
which caused the problems in the first place.

If header inclusion impact negatively on build times, then those headers
are badly designed. First, try to fix them, i.e. add proper include
guards and perhaps (conditional on the compiler) #pragma once. If that
doesn't help, consider whether you're accessing headers off a network
drive and have a really old, less than smart compiler. One fix is then
to upgrade the compiler. Another to move the headers to local storage.
A third, to use local storage wrapper headers.

--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?
May 28 '06 #8
Alf P. Steinbach wrote:
* Luke Meyers:
It's unfortunate that so many people are taught to add #includes into
headers for everything their class uses. You should only #include what
you absolutely *have to* in a header (most commonly base classes,
by-value members (when not using pimpl), and typedefs), and leave the
rest for the implementation file. This really helps to cut down on
build times and recompilation.
On the contrary.

The Microsoft style


Beg pardon? I don't know what "the Microsoft style" is, and I'm
curious why you assume I would. I'll proceed assuming you meant the
practice of minimizing header includes, preferring to place those
includes as locally as possible -- that is, in the implementation
files.
makes a mess of file dependencies,
As I see it, it reduces dependencies. If Bar uses Baz, and Foo uses
Bar but not Baz, under your scheme Foo must recompile anyway
(needlessly) whenever Baz.h changes. If the include of Baz.h is in
Bar.cpp, instead of Bar.h, this recompilation dependency goes away. If
your point of view is really contrary to this, could you please explain
your reasoning?
introduces #include statement order depends, with associated problems,
I fail to see the relationship here. Well-designed headers should not
have order dependencies, regardless of what other headers they do or
don't include. Order dependencies commonly arise from the practice of
relying on some other header to include the header you're using, rather
than just including it yourself. Such side-effects are not part of a
class's interface, can change without notice, and should not be relied
upon.
and often
results in one big mother-of-all include file to ensure that all that's
required is there, in the right order: imposing on all of the code that
which caused the problems in the first place.
I agree that this may occur, given the premise of #include order
dependencies. I disagree that the practice I recommend leads to such
order dependencies.
If header inclusion impact negatively on build times, then those headers
are badly designed.
In what sense? The recompilation dependency introduced by
unnecessarily moving #includes to headers, per your recommendation, is
sufficient to drastically reduce average build speed.
First, try to fix them, i.e. add proper include
guards and perhaps (conditional on the compiler) #pragma once.
Include guards are a remedial and obvious step -- omission of them will
cause all sorts of problems in any case. My recommendation assumes
that such basic steps are universally taken -- if they're not, then the
answer is to adopt them, not to move #include directives around.
If that
doesn't help, consider whether you're accessing headers off a network
drive and have a really old, less than smart compiler. One fix is then
to upgrade the compiler. Another to move the headers to local storage.
A third, to use local storage wrapper headers.


These are non-sequiturs -- while such steps may improve build speeds
for some people in some situations, they have nothing to do with the
aspect of #include structure under discussion. Please let's get back
to the point at hand; explain, if you would, your reasoning from the
point where our opinions diverged.

Luke

May 28 '06 #9
* Luke Meyers:
Alf P. Steinbach wrote:
* Luke Meyers:
It's unfortunate that so many people are taught to add #includes into
headers for everything their class uses. You should only #include what
you absolutely *have to* in a header (most commonly base classes,
by-value members (when not using pimpl), and typedefs), and leave the
rest for the implementation file. This really helps to cut down on
build times and recompilation.

On the contrary.

The Microsoft style


Beg pardon? I don't know what "the Microsoft style" is, and I'm
curious why you assume I would. I'll proceed assuming you meant the
practice of minimizing header includes, preferring to place those
includes as locally as possible -- that is, in the implementation
files.


It may be that we're not really disagreeing.

However, what you wrote has as its limit to not include other headers in
a header, and leave that to the implementation files, since what you
"absolutely /have to/" include is zero, nix, nada; a common practice
with Microsoft (e.g. Visual Studio generated headers are that way).

Since I only criticized that abhorrent practice, not stating anything
about my own preferences, perhaps that would be in order; see ch 1.6 of
<url: http://home.no.net/dubjai/win32cpptut/html/w32cpptut_01.html>,
where the most important quote is (quoting myself :-) ) "A header file
should always be self-contained: it should be possible to just #include
it without having to #include any other headers first"; subject to that
requirement it's fine to minimize the dependencies, otherwise IMO not.

--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?
May 28 '06 #10
Alf P. Steinbach wrote:
It may be that we're not really disagreeing.

However, what you wrote has as its limit to not include other headers in
a header, and leave that to the implementation files, since what you
"absolutely /have to/" include is zero, nix, nada; a common practice
with Microsoft (e.g. Visual Studio generated headers are that way).
I see now whence came confusion. I could have stated it less strongly,
but do note that I gave several examples of what I meant by "absolutely
have to" -- base classes, by-value members, and typedefs. The
Microsoft Way you describe evidently jumps through hoops to elide even
these, with the consequences you describe. So, I'll try to be less
liberal with universal qualifiers, but I do wonder whether you really
thought I meant to recommend such an extreme, given that doing so would
contraindicate the examples I explicitly gave.
Since I only criticized that abhorrent practice, not stating anything
about my own preferences, perhaps that would be in order; see ch 1.6 of
<url: http://home.no.net/dubjai/win32cpptut/html/w32cpptut_01.html>,
I'll have to satisfy myself with the section you quoted -- downloading
and unzipping a word doc is generally past my pain threshold for casual
newsreading. HTML-ify it and I'll gladly take a peek.
where the most important quote is (quoting myself :-) )
I get accused of that a lot when I cite Scott Meyers. ;)
"A header file
should always be self-contained: it should be possible to just #include
it without having to #include any other headers first"; subject to that
requirement it's fine to minimize the dependencies, otherwise IMO not.


Yes. This strikes me as so fundamental that I would rather state it as
an absolute than suggest any ambiguity.

Luke

May 28 '06 #11
Ben
> Certainly.

It's unfortunate that so many people are taught to add #includes into
headers for everything their class uses. You should only #include what
you absolutely *have to* in a header (most commonly base classes,
by-value members (when not using pimpl), and typedefs), and leave the
rest for the implementation file. This really helps to cut down on
build times and recompilation.

While you're looking at the FAQ, take a peek at the section on posting
etiquette and quoting conventions -- really helps if you indicate what
you're replying to.


Aaahh...I finally figured it out! I just removed the #include <B.h>
from A.h, and put an #include <B.h> in front of everywhere that there
is an #include <A.h>

May 28 '06 #12

Luke Meyers wrote:
Alf P. Steinbach wrote:
It may be that we're not really disagreeing.

However, what you wrote has as its limit to not include other headers in
a header, and leave that to the implementation files, since what you
"absolutely /have to/" include is zero, nix, nada; a common practice
with Microsoft (e.g. Visual Studio generated headers are that way).


I see now whence came confusion. I could have stated it less strongly,
but do note that I gave several examples of what I meant by "absolutely
have to" -- base classes, by-value members, and typedefs. The
Microsoft Way you describe evidently jumps through hoops to elide even
these, with the consequences you describe. So, I'll try to be less
liberal with universal qualifiers, but I do wonder whether you really
thought I meant to recommend such an extreme, given that doing so would
contraindicate the examples I explicitly gave.
Since I only criticized that abhorrent practice, not stating anything
about my own preferences, perhaps that would be in order; see ch 1.6 of
<url: http://home.no.net/dubjai/win32cpptut/html/w32cpptut_01.html>,


I'll have to satisfy myself with the section you quoted -- downloading
and unzipping a word doc is generally past my pain threshold for casual
newsreading. HTML-ify it and I'll gladly take a peek.
where the most important quote is (quoting myself :-) )


I get accused of that a lot when I cite Scott Meyers. ;)
"A header file
should always be self-contained: it should be possible to just #include
it without having to #include any other headers first"; subject to that
requirement it's fine to minimize the dependencies, otherwise IMO not.


Yes. This strikes me as so fundamental that I would rather state it as
an absolute than suggest any ambiguity.

Luke


M$ headers suck a lot!
Try using winsock2.h and you will see wonders

even openGL headers may annoy the M$ unexperienced user :-(

May 29 '06 #13

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

1
by: Vince C. | last post by:
Hi all, I've created XML documents that are described with a schema. I'm using those documents to create web pages. All my web pages contain a fixed header and a variable document part. The...
15
by: Mon | last post by:
I am in the process of reorganizing my code and came across and I came across a problem, as described in the subject line of this posting. I have many classes that have instances of other classes...
7
by: Srini | last post by:
Hello, Rules for inline functions say that they have to be defined in the same compilation unit as their declarations. For class member functions this means that the inline member functions must...
7
by: A_StClaire_ | last post by:
hi, I'm working on a project spanning five .cpp files. each file was used to define a class. the first has my Main and an #include for each of the other files. problem is my third file...
14
by: Murkland | last post by:
Hi. I have a problem with a template class that I'm trying to inherit from. The code for the base class is: template <class T> class BaseClass { public: BaseClass(); ~BaseClass();
7
by: mathieu | last post by:
Hello, I did read the FAQ on template(*), since I could not find an answer to my current issue I am posting here. I have tried to summarize my issue in the following code (**). Basically I am...
4
by: zfareed | last post by:
#include <iostream> #include <fstream> using namespace std; template<class ItemType> class SortedList { private:
15
by: akomiakov | last post by:
Is there a technical reason why one can't initialize a cost static non- integral data member in a class?
6
by: Gaijinco | last post by:
I'm trying to do a template class Node. My node.hpp is: #ifndef _NODE_HPP_ #define _NODE_HPP_ namespace com { namespace mnya { namespace carlos { template <typename T>
1
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
0
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...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
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$) { } ...
0
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...
0
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...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
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...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.