2011-12-16 11 views
1
#include <iostream> 

struct A 
{ 
    bool f(int a) { std::cout << "int" << std::endl; return true;}; 
    bool f(int a, int b) { std::cout << "two int" << std::endl; return true;}; 
    bool f(float a) {std::cout << "float" << std::endl; return true;}; 
    bool f(float a, float b) {std::cout << "two float" << std::endl; return true;}; 
}; 

template <typename T> 
struct Type 
{ 
    typedef bool (A::*One)(T); 
    typedef bool (A::*Two)(T, T); 
}; 

template <typename T, typename Type<T>::One F > 
void run(A & a) 
{ 
    T tmp = 0; 
    (a.*F)(tmp); 
} 


int main(int argc, char ** argv) 
{ 
    A a; 
    run<int, &A::f>(a); 
    run<float, &A::f>(a); 

    return 0; 
} 

問題はtypename Type<T>::One Fの構文にあります。 Typeからtypedefを使用する代わりに実際のメソッドポインタを指定すると、正常に動作します(herehereを参照)。 Typeのtypedefをテンプレート引数として使用する方法はありますか?他のテンプレートクラスの内部typedefによって定義された型のテンプレート引数

+1

あなたの例はわかりました。どのようなエラーが表示されますか、どのコンパイラを使用していますか? –

+0

+1完全なコンパイル可能な例と明確な質問を投稿してください。あなたのコードはコンパイルされ、私のために働いた。 –

+0

Ideoneの[here](http://ideone.com/SBJpR)、IBMコンパイラでコンパイルしたときに、 '非型のテンプレートパラメータに" bool(float、float) "という形式を持つことはできません。 CCコンパイラ。 – elmo

答えて

1

私の現在の推測では、IBM xlCとSun CCの両方にバグがあります。

エラーを返すバージョンは、おそらくtypenameをテンプレート引数コンテキストで使用すると混乱しますが、依存する名前が型引数を導入する代わりに型であることを示すために使用されます。これらのコンパイラは準拠しておらず、従属名が(コードがコンパイルされるSun CCのバージョンであっても)必要な他のコンテキストでも依存名がタイプであることを示すためにtypenameを要求しないことに注意してください。

関連する問題