gl5_progのメモ

自分のためのメモとかまとめとか

C++03ではテンプレート引数としてローカル型を渡すことができない

http://ideone.com/ULCO6F

#include <stdio.h>

#define INNER_STRUCT

class A
{
public:
template<class T> void Func( T& ){}
};
   #ifndef INNER_STRUCT
    struct Visitor
    {};
   #endif
int main( void )
{
    A a;
   #ifdef INNER_STRUCT
    struct Visitor
    {};
   #endif
    Visitor v;
    a.Func<Visitor>( v );
    return 0;
}

結果

prog.cpp:22: error: no matching function for call to 'A::Func(main()::Visitor&)'

普段Clangで通っていたコードが、久しぶりにgccでビルドしてみるとエラーに。調べてみると、テンプレート引数としてローカル型(関数内で定義した型?)を渡すのはC++03ではダメらしい。(C++11は大丈夫らしい)

ところでなぜClangではビルドが通っていたのだろうか。Clangの方が規格に厳密なイメージがあるのに。

参考 Local type as template arguments in C++ - Stack Overflow