Namespace/Template member initialization issue

B

Brian Ross

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
 
J

John Harrison

Brian Ross said:
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 said:
{ }

}
---

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

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
 
B

Brian Ross

John Harrison said:
Brian Ross said:
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 said:
{ }

}
---

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

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.

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
 
J

John Harrison

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

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,012
Latest member
RoxanneDzm

Latest Threads

Top