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>:BType<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>:BType [with R=CProject]" is missing
return createValueContainer<R>:BType::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>:BType<DBT>::createAltValue(pField);
}
};
int main(void)
{
createAltValueContainer<std::string>::createAltValue(
CProject::Fields::Test);
}
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>:BType<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>:BType [with R=CProject]" is missing
return createValueContainer<R>:BType::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>:BType<DBT>::createAltValue(pField);
}
};
int main(void)
{
createAltValueContainer<std::string>::createAltValue(
CProject::Fields::Test);
}