[cfe-dev] Template instantiation fails in SFINAE context, but results in an error

Eli Friedman eli.friedman at gmail.com
Sat Aug 4 02:13:26 PDT 2012


On Sat, Aug 4, 2012 at 1:45 AM, Jonathan Sauer <jonathan.sauer at gmx.de> wrote:
> Hello,
>
> I'm not sure if the following program does not compile due to a bug in clang or due to me
> misunderstanding SFINAE rules (most likely the latter):
>
> template <typename T>
> struct Traits {
>     using type = typename T::type;
> };
>
> template <typename T>
> int foo(...)
> {
>     return 0;
> }
>
> template <typename T>
> int foo(char[sizeof(Traits<T>)])
> {
>     return 1;
> }
>
> struct Bar {
>     typedef int type;
> };
>
> int main()
> {
>     return foo<int>(0);
>     //return foo<Bar>(0);
> }
>
>
> I would expect this program to compile and, when run, return 0, as the second version of
> <foo> cannot be used due to <int> not having a member <type> when instantiating the <Traits>
> template inside a SFINAE context. Instead I get the following error (clang r160613):
>
> % clang++ -std=c++11 RandomTest.cpp
> RandomTest.cpp:3:27: error: type 'int' cannot be used prior to '::' because it has no members
>     using type = typename T::type;
>                           ^
> RandomTest.cpp:13:14: note: in instantiation of template class 'Traits<int>' requested here
> int foo(char[sizeof(Traits<T>)])
>              ^
> RandomTest.cpp:13:5: note: while substituting explicitly-specified template arguments into function
>       template 'foo'
> int foo(char[sizeof(Traits<T>)])
>     ^
> 1 error generated.
>
>
> I don't understand why this error happens. Can anybody help me out, please?

See [temp.deduct]p8?  SFINAE simply doesn't work that way.

-Eli



More information about the cfe-dev mailing list