2011-08-02 10 views
2
#include <iostream> 

template<typename T, int = 0> 
struct test { 
    typedef char type[3]; 
}; 

template<int N> 
struct test<long *, N> { 
    typedef char type[7]; 
}; 

int main() 
{ 
    std::cout << sizeof(test<int*>::type) << std::endl; // 3 
    std::cout << sizeof(test<long*>::type) << std::endl; // 7 
    return 0; 
} 

予想通りsizeof(test<long*>::type) == 3です。なぜそれは7ですか?テンプレート型の奇妙な挙動

+0

なぜ3になると思いますか? –

答えて

3

あなたがしたことは、型引数がlong*であるときはいつでも、テンプレートの2番目のフォームを使用する必要があるということです。他の引数については、テンプレートの最初の形式(サイズ3)を使用します。

+0

'構造体テスト'テンプレートでは変数型が許可されていないので、型引数が 'long *'のときは必ず設定します。 Nがゼロ以外のときは常に特殊化したい場合は、同様に行うことができます(ただし、ベースを0以外の場合に簡単に見つけることができます)。 –

+0

'N'は汎用形式から継承されますか? –

+1

はい。 'test '(整数引数なし)を宣言すると、コンパイラーは特殊化を実行する前に 'test 'を置き換えます。 –

1

タイプ引数がlong*の場合、サイズが変更されるようにテンプレートを特殊化しました。私は、あなたが使用したいtest<int*>フォームとtest<123>フォームを混在させることはできないと確信しています(タイプまたは値のいずれかのパラメータの意味は?)。

#include <iostream> 

template<typename T, int = 0> 
struct test { 
    typedef char type[3]; 
}; 

template<int N> 
struct test<int, N> { 
    typedef char type[7]; 
}; 

int main() 
{ 
    std::cout << sizeof(test<int*>::type) << std::endl; // 3 
    std::cout << sizeof(test<long*>::type) << std::endl; // 3 
    std::cout << sizeof(test<int, 123>::type) << std::endl; // 7 
    return 0; 
} 

たぶん、あなたは私たちにあなたはそれが役立つだろう解決しようとしている本当の問題を伝える場合:あなたができる最善のようなものです。