Error referring to a template within a template - why?

A

Adam Nielsen

Hi everyone,

I've come up against an issue with template types. Interestingly enough
it seems to trigger a bug in GCC 3.3.4 (it accepts the code but wrongly
replaces the typename), whereas Comeau's online compiler reports it as
an error.

Either way I don't quite understand what the problem is. If someone
could point it out for me, it would be much appreciated!

Comeau gives this error:

"ComeauTest.c", line 37: error: type name is not allowed
return createValueContainer<R>::DBType<DBT>::createAltValue(pField);
^

Of course if I take the error literally and remove the type name, it
tells me I need one:

"ComeauTest.c", line 37: error: argument list for class template
"createValueContainer<R>::DBType [with R=CProject]" is missing
return createValueContainer<R>::DBType::createAltValue(pField);
^

Whereas GCC accepts the code, but treats R == DBT, even though they're
not the same type. The compilable code is below.

Any suggestions as to where I'm going wrong?

Thanks,
Adam.


#include <string>

// Cut down datatypes to make this sample easier to read
class IValue {};
template <class R, typename T>
class TField {};

struct CProject {
struct Fields {
static TField<CProject, int> Test;
};
};
TField<CProject, int> CProject::Fields::Test;


template <class R>
struct createValueContainer {

template <typename DBT>
struct DBType {
template <typename T>
inline static IValue *createAltValue(const TField<R, T>& pField)
throw ()
{
// Do something with a variable of type DBT
return NULL;
}
};

};

template <typename DBT>
struct createAltValueContainer {
template <class R, typename T>
inline static IValue *createAltValue(const TField<R, T>& pField)
throw ()
{
// This next line doesn't seem to work. GCC gives an error and
// reports that R = std::string when it should be CProject.
return createValueContainer<R>::DBType<DBT>::createAltValue(pField);
}
};

int main(void)
{
createAltValueContainer<std::string>::createAltValue(
CProject::Fields::Test);
}
 
A

Alf P. Steinbach

* Adam Nielsen:
Hi everyone,

I've come up against an issue with template types. Interestingly enough
it seems to trigger a bug in GCC 3.3.4 (it accepts the code but wrongly
replaces the typename), whereas Comeau's online compiler reports it as
an error.

Either way I don't quite understand what the problem is. If someone
could point it out for me, it would be much appreciated!

Comeau gives this error:

"ComeauTest.c", line 37: error: type name is not allowed
return createValueContainer<R>::DBType<DBT>::createAltValue(pField);
^

Of course if I take the error literally and remove the type name, it
tells me I need one:

"ComeauTest.c", line 37: error: argument list for class template
"createValueContainer<R>::DBType [with R=CProject]" is missing
return createValueContainer<R>::DBType::createAltValue(pField);
^

Whereas GCC accepts the code, but treats R == DBT, even though they're
not the same type. The compilable code is below.

Any suggestions as to where I'm going wrong?

Thanks,
Adam.


#include <string>

// Cut down datatypes to make this sample easier to read
class IValue {};
template <class R, typename T>
class TField {};

struct CProject {
struct Fields {
static TField<CProject, int> Test;
};
};
TField<CProject, int> CProject::Fields::Test;


template <class R>
struct createValueContainer {

template <typename DBT>
struct DBType {
template <typename T>
inline static IValue *createAltValue(const TField<R, T>& pField)
throw ()
{
// Do something with a variable of type DBT
return NULL;
}
};

};

template <typename DBT>
struct createAltValueContainer {
template <class R, typename T>
inline static IValue *createAltValue(const TField<R, T>& pField)
throw ()
{
// This next line doesn't seem to work. GCC gives an error and
// reports that R = std::string when it should be CProject.
return createValueContainer<R>::DBType<DBT>::createAltValue(pField);

What DBType is or isn't depends on the template parameter R.

You'll need to qualify with "template typename" or "typename template",
I don't recall the exact syntax but just look it up.

In short you need to tell the compiler what kind of beast DBType is.
 
A

Adam Nielsen

// This next line doesn't seem to work. GCC gives an error and
What DBType is or isn't depends on the template parameter R.

You'll need to qualify with "template typename" or "typename template",
I don't recall the exact syntax but just look it up.

In short you need to tell the compiler what kind of beast DBType is.

Aha, that was it! I thought that was the problem but had no idea of the
syntax. Changing the line to this worked:

return createValueContainer<R>::template
DBType<DBT>::createAltValue(pField);

Thanks for your help!

Cheers,
Adam.
 
K

Kai-Uwe Bux

Adam said:
Hi everyone,

I've come up against an issue with template types. Interestingly enough
it seems to trigger a bug in GCC 3.3.4 (it accepts the code but wrongly
replaces the typename), whereas Comeau's online compiler reports it as
an error.

Either way I don't quite understand what the problem is. If someone
could point it out for me, it would be much appreciated!

Comeau gives this error:

"ComeauTest.c", line 37: error: type name is not allowed
return createValueContainer<R>::DBType<DBT>::createAltValue(pField);

DBType is a template, and you need to tell the compiler:

createValueContainer<R>::template DBType<DBT>::createAltValue(pField);
^^^^^^^^^^^^^^^^^^^^

Of course if I take the error literally and remove the type name, it
tells me I need one:

"ComeauTest.c", line 37: error: argument list for class template
"createValueContainer<R>::DBType [with R=CProject]" is missing
return createValueContainer<R>::DBType::createAltValue(pField);

[snip]


Best

Kai-Uwe Bux
 

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,767
Messages
2,569,570
Members
45,045
Latest member
DRCM

Latest Threads

Top