|
Boost : |
From: Lois Goldthwaite (loisg_at_[hidden])
Date: 2001-01-02 08:44:34
I'm inclined to agree with MIPSPro over VC (so is Sun's 5.0 compiler,
BTW). Isn't it supposed to check for legal constructs at the point of
instantiation?
As a matter of curiosity, did you try specifying the default template
parameter this way:
template <class T = Null >
class Foo
{
public:
Foo( T t = T() ) {}
};
VC seems equally happy with it.
Lois
> Message: 6
> Date: Tue, 02 Jan 2001 14:02:11 +1030
> From: Andrew Myers <andrew_at_[hidden]>
> Subject: Problems compiling graph library on IRIX.
>
> To start with, I realise the IRIX compilers are not among the supported
> compilers, but this might be useful for future support.
>
> The platform on interest is IRIX 6.5, running version 7.30 of the MIPSPro
> compilers. I am using boost 1.19.0.
>
> I have two problems that have appeared.
>
> Problem 1
> ---------
>
> The following is a stripped down piece of code that fails to compile on IRIX,
> but compiles successfully on MSVC++ 6, (which is my other platform of interest)
>
> Similar code appears in boost/graph/breadth_first_search.hpp, where the
> make_bfs_visitor function, returns a bfs_visitor object, whose constructor has a
> default null_visitor() argument. This means libs/graph/example/bfs_basics.C does
> not compile.
>
>
> struct Null
> {
> };
>
> template <class T>
> class Foo
> {
> public:
> Foo( T t = Null() ) {}
> };
>
> template <class T>
> Foo<T>
> MakeFoo( T t )
> {
> return Foo<T>(t);
> };
>
> main()
> {
> // Bad on IRIX
> int i = 1;
> MakeFoo<int>( i );
>
> // OK on IRIX;
> // Null i;
> // MakeFoo<Null>(i);
>
> return 0;
> }
>
>
> The resulting error message is,
>
> cc-1387 CC: ERROR File = temp.C, Line = 9
> No suitable conversion function from "Null" to "int" exists.
>
> Foo( T t = Null() ) {}
> ^
> detected during instantiation of class "Foo<int>" at line 23
>
> 1 error detected in the compilation of "temp.C".
>
>
>
> It would appear the compiler is attempting to build the Foo constructor,
> assigning the default argument when it is not necessary, since an argument is
> being passed.
>
> My suggested workaround for this would be to replace the current constructor
> with two constructors
>
> class Foo
> {
> public:
> Foo() {}; // Initialise member data with Null
> Foo( T t ) {};
> };
>
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk