[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Solved: Confused about friend operators, namespaces, and private members
From: |
Robert Heller |
Subject: |
Solved: Confused about friend operators, namespaces, and private members... |
Date: |
Wed, 18 Nov 2009 13:46:24 -0600 |
At Tue, 17 Nov 2009 15:56:08 -0600 Robert Heller <heller@deepsoft.com> wrote:
>
> I am using gcc 3.4.6 under CentOS 4.8 (RHEL 4.8):
> Reading specs from /usr/lib/gcc/i386-redhat-linux/3.4.6/specs
> Configured with: ../configure --prefix=/usr --mandir=/usr/share/man
> --infodir=/usr/share/info --enable-shared --enable-threads=posix
> --disable-checking --with-system-zlib --enable-__cxa_atexit
> --disable-libunwind-exceptions --enable-java-awt=gtk
> --host=i386-redhat-linux
> Thread model: posix
> gcc version 3.4.6 20060404 (Red Hat 3.4.6-11)
>
> And I am getting errors like this:
>
> ./../../C++/ParserClassesBoost/TrackGraph.cc: In function
> `Parsers::TrackGraph::Transform2D* operator*(const
> Parsers::TrackGraph::Transform2D&, const Parsers::TrackGraph::Transform2D&)':
> ./../../C++/ParserClassesBoost/TrackGraph.h:747: error: `float
> Parsers::TrackGraph::Transform2D::matrix[3][3]' is private
> ./../../C++/ParserClassesBoost/TrackGraph.cc:675: error: within this context
> ./../../C++/ParserClassesBoost/TrackGraph.h:747: error: `float
> Parsers::TrackGraph::Transform2D::matrix[3][3]' is private
> ./../../C++/ParserClassesBoost/TrackGraph.cc:675: error: within this context
> ./../../C++/ParserClassesBoost/TrackGraph.h:747: error: `float
> Parsers::TrackGraph::Transform2D::matrix[3][3]' is private
> ./../../C++/ParserClassesBoost/TrackGraph.cc:676: error: within this context
> make[1]: *** [libMRRParserClassesBoost_la-TrackGraph.lo] Error 1
> make[1]: Leaving directory
> `/home/heller/Deepwoods/ModelRRSystem/Linux/C++/ParserClassesBoost'
> make: *** [all] Error 2
>
> Here is the relevant fragment of TrackGraph.cc:
>
> using namespace Parsers;
>
> TrackGraph::Transform2D* operator * (const TrackGraph::Transform2D& t1, const
> TrackGraph::Transform2D& t2)
> {
> TrackGraph::Transform2D *new_t = new TrackGraph::Transform2D;
>
> for(int i=0; i < 3; i++)
> for(int j=0; j < 3; j++) {
> float sum = 0.0;
> for(int k=0; k < 3; k++)
> sum += t1.matrix[j][k] * t2.matrix[k][i];
> new_t->matrix[j][i] = sum;
> }
>
> return new_t;
> }
>
> And of TrackGraph.h:
>
> namespace Parsers {
>
> class TrackGraph {
> public:
> class Transform2D {
> private:
> /** Transform matrix.
> */
> float matrix[3][3];
> /** Fuzz factor.
> */
> const static float FUZZ = .00001;
> public:
> /** Matrix multiplication.
> */
> friend Transform2D* operator * (const Transform2D& t1,const
> Transform2D& t2);
> };
> };
>
> };
>
> I don't understand these error messages. They didn't happen before I
> added the namespace code. I would *like* to embed my code in a
> namespace and not put random stuff into the global namespace, but
> either gcc 3.4.6 does not handle namespaces well when dealing with
> friend operators or I am doing something wrong, but I don't know what
> that could be. For various reasons I don't want to install a newer
> version of gcc (I want to stay binary compatible with the rest of my
> system).
>
OK, I figured out that I needed to qualify the friend operators with the
namespace -- appearently things are ambigious otherwise. The error
message is a little confusing (to me).
--
Robert Heller -- 978-544-6933
Deepwoods Software -- Download the Model Railroad System
http://www.deepsoft.com/ -- Binaries for Linux and MS-Windows
heller@deepsoft.com -- http://www.deepsoft.com/ModelRailroadSystem/
- Confused about friend operators, namespaces, and private members..., Robert Heller, 2009/11/17
- Re: Confused about friend operators, namespaces, and private members..., Thomas Maeder, 2009/11/18
- Re: Confused about friend operators, namespaces, and private members..., address@hidden, 2009/11/18
- Solved: Confused about friend operators, namespaces, and private members...,
Robert Heller <=