read1
のコンパイラはなぜ一致しませんか? read1
とread2
の違いはわかりません。 Foo
クラスのようなネストされたtypedefテンプレートには制限がありますか?テンプレート関数の引数としてC++のテンプレートtypedef
template<typename T>
class Handle{};
class Foo{
public:
typedef Handle<Foo> Handle;
};
template<typename T>
void read1(typename T::Handle){}
template<typename T>
void read2(Handle<T>){}
int main(int argc, char** argv)
{
Foo::Handle f1;
read1(f1);
Foo::Handle f2;
read2(f2);
}
G ++コンパイラの出力、(G ++ 4.4.5)
g++ -c -I. main1.cpp
main1.cpp: In function ‘int main(int, char**)’:
main1.cpp:37: error: no matching function for call to ‘read1(Handle<Foo>&)’
冗長な「内部」名前空間を削除し、例を簡潔にしました。 – Xeo
G ++ 4.4.5で編集したコードは 'g ++ -c main.cpp main.cpp:8:error: 'typedef class Handleの宣言 Foo :: Handle' main.cpp:3:エラー:変更'int handle(int、char **)': main.cpp:関数 'int main(int、char **)'内で: 'handle'の意味 'handle'の意味は 'handle1'(ハンドル &) '' –