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.

Go Back   { mindfrost82.com } > Gadget Corner > Tech Newsgroups > Programming > C++

Reply
 
LinkBack Thread Tools Search this Thread Display Modes
  #1 (permalink)  
Old 08-07-2008, 12:28 PM
podb.visys@gmail.com
 
Posts: n/a
[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! ]

Reply With Quote
  #2 (permalink)  
Old 08-07-2008, 04:58 PM
Markus Moll
 
Posts: n/a
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! ]

Reply With Quote
  #3 (permalink)  
Old 08-07-2008, 04:58 PM
Bo Persson
 
Posts: n/a
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! ]

Reply With Quote
Reply

  { mindfrost82.com } > Gadget Corner > Tech Newsgroups > Programming > C++


Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are Off
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On



All times are GMT. The time now is 06:17 PM.


Powered by vBulletin, Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.1.0 ©2007, Crawlability, Inc.
© 1999-2008 mindfrost82.com v11.0


Sponsors:
Debt Consolidation | Credit Cards | Credit Reports | Personal Finance | Mortgage Calculator



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114