Updated below.
The following is the entire code I have in my main.cpp:
template<class T>
struct other_traits;
template<class T>
struct some_traits{
typedef decltype(&T::operator()) Fty;
typedef typename other_traits<Fty>::type type;
};
int main(){
}
But I get the following errors with Visual Studio 2010 while g++ compiles just fine:
src\main.cpp(9): error C2146: syntax error : missing ';' before identifier 'type'
--src\main.cpp(10) : see reference to class template instantiation 'some_traits<T>
' being compiled
src\main.cpp(9): error C2868: 'some_traits<T>::type
' : illegal syntax for using-declaration; expected qualified-name
(I like that last one, total wtf.)
Can I take that as a bug in VC10 or is there any good reason for the early instantiation? Or is it a bug with decltype
that makes the compiler think that Fty
is not a dependent name?
Update: I tried to cheat the compiler in thinking that Fty
is a dependent name using a base class to inherit from:
template<class T>
struct other_traits;
template<class R, class C>
struct other_traits<R (C::*)()>{
typedef R type;
};
template<class Fty>
struct base_traits{
typedef typename other_traits<Fty>::type type;
};
template<class T>
struct some_traits
: public base_traits<decltype(&T::operator())>
{};
But the compiler still tries to instantiate / compile everything on the spot, spewing these errors:
src\main.cpp(13): error C2039: 'type' : is not a member of 'other_traits<T>'
with
[
T=
]
src\main.cpp(19) : see reference to class template instantiation 'base_traits<Fty>' being compiled
with
[
Fty=
]
src\main.cpp(19) : see reference to class template instantiation 'some_traits<T>' being compiled
src\main.cpp(13): error C2146: syntax error : missing ';' before identifier 'type'
src\main.cpp(13): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
src\main.cpp(13): error C2602: 'base_traits<Fty>::type' is not a member of a base class of 'base_traits<Fty>'
with
[
Fty=
]
src\main.cpp(13) : see declaration of 'base_traits<Fty>::type'
with
[
Fty=
]
src\main.cpp(13): error C2868: 'base_traits<Fty>::type' : illegal syntax for using-declaration; expected qualified-name
with
[
Fty=
]
Note that the template parameters are empty. Any ideas?
typedef typename other_traits<typename Fty>::type type;
(just a blind shot). – GasometryFty
,other_traits<Fty>
andother_traits<Fty>::type
are all types. It looks a bit like VC++ is doing some error checking before instantiation (which it's allowed to do, to a point), but getting confused - possibly because of the use of "decltype". – Reliquestruct other_traits; template<class T> struct some_traits { typedef other_traits::type hype; };
(thehype
is not a typo, I wanted to check if it got confused with both having the same name) – Methenaminedecltype(...)
simply withT
. – Reichedecltype(&T::operator())
is a non-dependent type. All that surprises me though, because I was told that MSVC doesn't really parse templates. So I'm not sure why it rejects that template. – Bilesdecltype(...)
as a template parameter to a base class I think. I'll try that asap. – Reiche