By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,193 Members | 843 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,193 IT Pros & Developers. It's quick & easy.

Namespace/Template member initialization issue

P: n/a
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
Jul 19 '05 #1
Share this Question
Share on Google+
3 Replies


P: n/a

"Brian Ross" <br**********@rogers.com> wrote in message
news:ZH********************@news04.bloor.is.net.ca ble.rogers.com...
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


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
Jul 19 '05 #2

P: n/a

"John Harrison" <jo*************@hotmail.com> wrote in message
news:bh************@ID-196037.news.uni-berlin.de...

"Brian Ross" <br**********@rogers.com> wrote in message
news:ZH********************@news04.bloor.is.net.ca ble.rogers.com...
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


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
Jul 19 '05 #3

P: n/a
>
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
Jul 19 '05 #4

This discussion thread is closed

Replies have been disabled for this discussion.