![]() |
|
|
Welcome to the { mindfrost82.com } forums. You are currently viewing our boards as a guest which gives you limited access to view most discussions and access our other features. By joining our free community you will have access to post topics, communicate privately with other members (PM), respond to polls, upload content and access many other special features. Registration is fast, simple and absolutely free so please, join our community today! If you have any problems with the registration process or your account login, please contact contact us. |
|
|||||||
![]() |
|
|
LinkBack | Thread Tools | Search this Thread | Display Modes |
|
|||
|
[templates] scope global variable
Hi all,
I'm a bit confused why the code below actually compiled (msvc 8.0): =====================BEGIN CODE====================== #include <iostream> template<bool test> struct a_templated_struct { a_templated_struct() { std::cout << global_var << std::endl; } }; int _tmain(int argc, _TCHAR* argv[]) { a_templated_struct<true> var; return 0; } const char* global_var = "a global var"; =====================END CODE====================== Isn't the spec (Bjarne Stroustrup) saying that the scope of a global name starts from the point of declaration until the end of the translation unit (4.9.4) And this rule also applies to undependable names in template definitions (C.13.8.2). And then there is C.13.8.3 and C.13.8.4. But still, it seems to me that global_var shouldn't be visible to anyone. Could someone explain me the rule playing here? Much appreciated. Pieter. -- [ See http://www.gotw.ca/resources/clcm.htm for info about ] [ comp.lang.c++.moderated. First time posters: Do this! ] |
|
|||
|
Re: [templates] scope global variable
Hi
podb.visys@gmail.com wrote: > Hi all, > > I'm a bit confused why the code below actually compiled (msvc 8.0): > > =====================BEGIN CODE====================== > #include <iostream> > > template<bool test> > struct a_templated_struct { a_templated_struct() { std::cout << > global_var << std::endl; } }; > > int _tmain(int argc, _TCHAR* argv[]) > { > a_templated_struct<true> var; > return 0; > } > > const char* global_var = "a global var"; > > =====================END CODE====================== GCC 4.3.0 doesn't compile it. And, like you, I think it shouldn't compile. The error message is as expected: t.cc: In constructor 'a_templated_struct<test>::a_templated_struct()': t.cc:7: error: 'global_var' was not declared in this scope Markus -- [ See http://www.gotw.ca/resources/clcm.htm for info about ] [ comp.lang.c++.moderated. First time posters: Do this! ] |
|
|||
|
Re: [templates] scope global variable
podb.visys@gmail.com wrote:
> Hi all, > > I'm a bit confused why the code below actually compiled (msvc > 8.0): > > =====================BEGIN CODE====================== > #include <iostream> > > template<bool test> > struct a_templated_struct { a_templated_struct() { std::cout << > global_var << std::endl; } }; > > int _tmain(int argc, _TCHAR* argv[]) > { > a_templated_struct<true> var; > return 0; > } > > const char* global_var = "a global var"; > > =====================END CODE====================== > > Isn't the spec (Bjarne Stroustrup) saying that the scope of a global > name starts from the point of declaration until the end of the > translation unit (4.9.4) And this rule also applies to undependable > names in template definitions (C.13.8.2). And then there is C.13.8.3 > and C.13.8.4. But still, it seems to me that global_var shouldn't be > visible to anyone. Could someone explain me the rule playing here? > Much appreciated. > The problem here is that the compiler doesn't implement the 2 phase lookup properly. It should detect that global_var is not visible at the point of definition of the template, and not just use some name that happens to appear later. Other compilers catch this. Bo Persson -- [ See http://www.gotw.ca/resources/clcm.htm for info about ] [ comp.lang.c++.moderated. First time posters: Do this! ] |
![]() |
|
| Thread Tools | Search this Thread |
| Display Modes | |
|
|