F
Fred Zwarts \(KVI\)
I have a template class:
template <typename Base_t> class Rational_t {
// Definition of private and public members left out.
// Probably not relevant.
};
I want an output operator << for this class for different output streams.
I am not sure that I completely understand the hierarchy of the i/o stream
classes, but I have the impression that the base class in which the operator
<< is defined is a template class. (It would be much easier if the first
class in which the << operator is defined, were a non-template class.) So, I
need at least two template parameters for my << operator. Therefore, in the
same header file I had:
template <typename Base_t, typename ostream_t>
ostream_t & operator<<
(ostream_t & out, const Rational_t<Base_t> & Rat) {
// Implementation left out.
// Probably not relevant.
}
This works.
Now, I want to change the implementation of the << operator a bit, for which
it needs access to some private members of the Rational_t class. Therefore,
I want to make the << operator a friend of the class. This requires a few
forward declarations at the start of the file.
template <typename Base_t> class Rational_t;
template <typename Base_t, typename ostream_t>
ostream_t & operator<<
(ostream_t & out, const Rational_t<Base_t> & Rat);
This also still works, as long as the implementation of the << operator does
not access the private members of Rational_t.
I have tried several ways to write the friend declaration, but non of them
works.
I think the last one I tried was:
template <typename Base_t> class Rational_t {
template <typename ostream_t>
friend ostream_t& operator<<
(ostream_t& out, const Rational_t & Rat);
// Definition of private and public members left out.
// Probably not relevant.
};
When I use g++ under Linux
(g++ (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973]),
I see a lot of messages like (One long line wrapped by me.):
TestRational.cpp.text+0xa93): undefined reference to
`std::basic_ostream<char, std::char_traits<char> >&
Rational:perator<<
<std::basic_ostream<char, std::char_traits<char> > >
(std::basic_ostream<char, std::char_traits<char> >&,
Rational::Rational_t<int> const&)'
It seems that the compiler has no problem with the code, but the linker has.
Usually this indicates that the friend declaration is interpreted as a
forward declaration, for which no implementation is found. So apparently
something is wrong with the friend declaration. But I don't see how I can
make it work.
Any suggestion?
template <typename Base_t> class Rational_t {
// Definition of private and public members left out.
// Probably not relevant.
};
I want an output operator << for this class for different output streams.
I am not sure that I completely understand the hierarchy of the i/o stream
classes, but I have the impression that the base class in which the operator
<< is defined is a template class. (It would be much easier if the first
class in which the << operator is defined, were a non-template class.) So, I
need at least two template parameters for my << operator. Therefore, in the
same header file I had:
template <typename Base_t, typename ostream_t>
ostream_t & operator<<
(ostream_t & out, const Rational_t<Base_t> & Rat) {
// Implementation left out.
// Probably not relevant.
}
This works.
Now, I want to change the implementation of the << operator a bit, for which
it needs access to some private members of the Rational_t class. Therefore,
I want to make the << operator a friend of the class. This requires a few
forward declarations at the start of the file.
template <typename Base_t> class Rational_t;
template <typename Base_t, typename ostream_t>
ostream_t & operator<<
(ostream_t & out, const Rational_t<Base_t> & Rat);
This also still works, as long as the implementation of the << operator does
not access the private members of Rational_t.
I have tried several ways to write the friend declaration, but non of them
works.
I think the last one I tried was:
template <typename Base_t> class Rational_t {
template <typename ostream_t>
friend ostream_t& operator<<
(ostream_t& out, const Rational_t & Rat);
// Definition of private and public members left out.
// Probably not relevant.
};
When I use g++ under Linux
(g++ (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973]),
I see a lot of messages like (One long line wrapped by me.):
TestRational.cpp.text+0xa93): undefined reference to
`std::basic_ostream<char, std::char_traits<char> >&
Rational:perator<<
<std::basic_ostream<char, std::char_traits<char> > >
(std::basic_ostream<char, std::char_traits<char> >&,
Rational::Rational_t<int> const&)'
It seems that the compiler has no problem with the code, but the linker has.
Usually this indicates that the friend declaration is interpreted as a
forward declaration, for which no implementation is found. So apparently
something is wrong with the friend declaration. But I don't see how I can
make it work.
Any suggestion?