Connecting Tech Pros Worldwide Forums | Help | Site Map

Namespace/Template member initialization issue

Brian Ross
Guest
 
Posts: n/a
#1: Jul 19 '05
Hi,

I am having a problem writing a constructor/member initialization with
VC.NET7.1.

Here is the code:

---

namespace Library
{
template <typename T>
class LibraryTemplateT
{ };
}

namespace Module
{
class ModuleObject : public Library::LibraryTemplateT<int>
{
public:
ModuleObject() throw();
};

// [1] FAILS: error C2614: 'Module::ModuleObject' : illegal member
initialization: 'LibraryTemplateT' is not a base or member
// ModuleObject::ModuleObject() throw() : LibraryTemplateT()
// { }

// [2] FAILS: error C2059: syntax error : '<'
// ModuleObject::ModuleObject() throw() : LibraryTemplateT<int>()
// { }

// [3] WORKS
ModuleObject::ModuleObject() throw() : Library::LibraryTemplateT<int>()
{ }

}
---

The weird thing is that if LibraryTemplateT is a class and not a template
then I am able to use the first option above and not have to manually
specify the Library namespace. Also, all three choices work when trying them
online at http://www.comeaucomputing.com/tryitout/.

Since I have existing code that is using option [1] above for non-templates
I would like to know:

- Is the code illegal (for both templates and regular classes). ie. is
option [3] the only legal way to write that code (without having a using
declaration)?
- Are templates somehow special and get resolved differently?
- Is this a bug?

Thanks



John Harrison
Guest
 
Posts: n/a
#2: Jul 19 '05

re: Namespace/Template member initialization issue



"Brian Ross" <brian.ross.x@rogers.com> wrote in message
news:ZHL%a.212759$rsJ.76040@news04.bloor.is.net.ca ble.rogers.com...[color=blue]
> Hi,
>
> I am having a problem writing a constructor/member initialization with
> VC.NET7.1.
>
> Here is the code:
>
> ---
>
> namespace Library
> {
> template <typename T>
> class LibraryTemplateT
> { };
> }
>
> namespace Module
> {
> class ModuleObject : public Library::LibraryTemplateT<int>
> {
> public:
> ModuleObject() throw();
> };
>
> // [1] FAILS: error C2614: 'Module::ModuleObject' : illegal member
> initialization: 'LibraryTemplateT' is not a base or member
> // ModuleObject::ModuleObject() throw() : LibraryTemplateT()
> // { }
>
> // [2] FAILS: error C2059: syntax error : '<'
> // ModuleObject::ModuleObject() throw() : LibraryTemplateT<int>()
> // { }
>
> // [3] WORKS
> ModuleObject::ModuleObject() throw() :[/color]
Library::LibraryTemplateT<int>()[color=blue]
> { }
>
> }
> ---
>
> The weird thing is that if LibraryTemplateT is a class and not a template
> then I am able to use the first option above and not have to manually
> specify the Library namespace. Also, all three choices work when trying[/color]
them[color=blue]
> online at http://www.comeaucomputing.com/tryitout/.
>
> Since I have existing code that is using option [1] above for[/color]
non-templates[color=blue]
> I would like to know:
>
> - Is the code illegal (for both templates and regular classes). ie. is
> option [3] the only legal way to write that code (without having a using
> declaration)?
> - Are templates somehow special and get resolved differently?
> - Is this a bug?
>
> Thanks
>[/color]

The following code compiles for me using VC++ 7.1

namespace Library
{
template <typename T>
class LibraryTemplateT
{ };
}
namespace Module
{
class ModuleObject : public Library::LibraryTemplateT<int>
{
public:
ModuleObject() throw() {}
};
}
int main()
{
Module::ModuleObject m;
}

Suggest you post the exact code you are having trouble with.

john


Brian Ross
Guest
 
Posts: n/a
#3: Jul 19 '05

re: Namespace/Template member initialization issue



"John Harrison" <john_andronicus@hotmail.com> wrote in message
news:bho2j5$1cqfp$1@ID-196037.news.uni-berlin.de...[color=blue]
>
> "Brian Ross" <brian.ross.x@rogers.com> wrote in message
> news:ZHL%a.212759$rsJ.76040@news04.bloor.is.net.ca ble.rogers.com...[color=green]
> > Hi,
> >
> > I am having a problem writing a constructor/member initialization with
> > VC.NET7.1.
> >
> > Here is the code:
> >
> > ---
> >
> > namespace Library
> > {
> > template <typename T>
> > class LibraryTemplateT
> > { };
> > }
> >
> > namespace Module
> > {
> > class ModuleObject : public Library::LibraryTemplateT<int>
> > {
> > public:
> > ModuleObject() throw();
> > };
> >
> > // [1] FAILS: error C2614: 'Module::ModuleObject' : illegal member
> > initialization: 'LibraryTemplateT' is not a base or member
> > // ModuleObject::ModuleObject() throw() : LibraryTemplateT()
> > // { }
> >
> > // [2] FAILS: error C2059: syntax error : '<'
> > // ModuleObject::ModuleObject() throw() : LibraryTemplateT<int>()
> > // { }
> >
> > // [3] WORKS
> > ModuleObject::ModuleObject() throw() :[/color]
> Library::LibraryTemplateT<int>()[color=green]
> > { }
> >
> > }
> > ---
> >
> > The weird thing is that if LibraryTemplateT is a class and not a[/color][/color]
template[color=blue][color=green]
> > then I am able to use the first option above and not have to manually
> > specify the Library namespace. Also, all three choices work when trying[/color]
> them[color=green]
> > online at http://www.comeaucomputing.com/tryitout/.
> >
> > Since I have existing code that is using option [1] above for[/color]
> non-templates[color=green]
> > I would like to know:
> >
> > - Is the code illegal (for both templates and regular classes). ie. is
> > option [3] the only legal way to write that code (without having a using
> > declaration)?
> > - Are templates somehow special and get resolved differently?
> > - Is this a bug?
> >
> > Thanks
> >[/color]
>
> The following code compiles for me using VC++ 7.1
>
> namespace Library
> {
> template <typename T>
> class LibraryTemplateT
> { };
> }
> namespace Module
> {
> class ModuleObject : public Library::LibraryTemplateT<int>
> {
> public:
> ModuleObject() throw() {}
> };
> }
> int main()
> {
> Module::ModuleObject m;
> }
>
> Suggest you post the exact code you are having trouble with.[/color]

Hi,

I think you missed the part where I mentioned that I have tried your
combination and I know that it works (look at the comments in my sample
code). My question was more about why the other variations work when not
using templates and if that code is illegal.

Brian


John Harrison
Guest
 
Posts: n/a
#4: Jul 19 '05

re: Namespace/Template member initialization issue


>[color=blue]
> Hi,
>
> I think you missed the part where I mentioned that I have tried your
> combination and I know that it works (look at the comments in my sample
> code). My question was more about why the other variations work when not
> using templates and if that code is illegal.
>
> Brian
>[/color]

You're right I missed the point, sorry about that. I surprised that 1 and 2
work at all even for non-templates, so I don't think I should say any more.

john


Closed Thread