Re: Isn't 'std:.string::npos' an integral constant?
On Sep 22, 11:50 pm, Paavo Helde <nob...@ebi.ee> wrote:
Hendrik Schober <spamt...@gmx.de> kirjutas:
Interestingly, Comeau compile this
struct test1 {
static const int x = -1;
};
struct test2 {
static const int x = test1::x;
};
without any complaints. However, it compiles this
struct test1 {
static const int x;
};
const int test1::x = 1;
struct test2 {
static const int x = test1::x;
};
just as well.
Indeed. However, if test1 is a template, it fails. Seems a bit
inconsistent.
Not really. A template definition is not a variable definition;
only the instantiation of a template definition is a variable
definition. And the "point of instantiation" of a member
function or member static variable is immediately following the
namespace scope declaration which triggers the instantiation.
So if you write:
template< typename T >
struct test1
{
static int const x ;
} ;
template< typename T >
int const test1::x = 1 ;
struct test2
{
static int const x = test1< int >::x ;
} ;
, the compiler inserts the instantiation of the class test1<int>
immediately before the definition of test2, and the
instantiation of the static data member immediately after, i.e.:
struct test1< int >
{
static int const x ;
} ;
struct test2
{
static int const x = test1< int >::x ;
} ;
int const test1< int >::x = 1 ;
And the value of test1< int >::x isn't visible when test2::x is
declared.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34