2016-11-05 6 views
0

私は2つのファイルを持っています - 1つは署名のない引数をテンプレートに渡し、もう1つはテンプレートの宣言と定義を含んでいます。署名されていない引数をテンプレートに渡す方法は?

/*File1.cc */ 
#include "File2.h" 
int main() 
{ 
    unsigned n = 10; 
    ThreadPool<n> pool; //Error 
..... 
} 




/* File_2.h */ 
.... 
namespace nbsdx { 
namespace concurrent { 

template <unsigned ThreadCount> 
class ThreadPool { 
    std::array<std::thread, ThreadCount> threads; 
.... 
}; 
}} 

行がエラーをスローし、const値のみを受け入れています。 nの値をThreadCountに渡す方法はありますか?

EDIT:コンパイル時にスレッドのサイズを変更可能にします。

+0

理由だけではなく、コンストラクタの引数を使わないのでしょうか? –

+0

@Jim上記のサンプルの文脈で小さな例を提供できればうれしいです。 – Scissor

+1

@JimV 'std :: array'は、コンパイル時定数サイジングを必要とします。 – user4581301

答えて

1

コンパイラが正しいコードを生成できるように、テンプレート引数とstd::arrayのサイズをコンパイル時に知っている必要があります。

オプション:

すべての静的サイジング。すべてがコンパイル時に設定され、実行時に変更することはできません。 Documentation on constexpr

#include <array> 
#include <thread> 

template <unsigned ThreadCount> 
class ThreadPool { 
    std::array<std::thread, ThreadCount> threads; 
}; 

int main() 
{ 
    constexpr unsigned n = 10; // n is fixed at compile time and unchangable. 
    ThreadPool<n> pool; //Error 
} 

std::vectorthreadpoolコンストラクタのパラメータ、およびMember Initializer List

#include <vector> 
#include <thread> 

class ThreadPool { 
    std::vector<std::thread> threads; 
public: 
    ThreadPool(unsigned n): threads(n) // constructs threads with n elements 
    { 
    } 
}; 

int main() 
{ 
    unsigned n = 10; 
    ThreadPool pool(n); 
} 
+0

ありがとうございます。これで解決しました。 – Scissor

0

いいえ、あなたのケースではnを渡すことはできません。 C++では、テンプレートは静的にコンパイルされます。したがって、そのパラメータはコンパイル時定数でなければなりません。だからconstexpr unsigned n = 10;はコンパイラを幸せにするでしょうが、私はあなたが望むものではありません。

しかし、可変長配列と呼ばれる機能を持つC99を使用すると(C11ではオプションになります)、実行時サイズの配列を宣言できます。

+0

可変長配列は、一部のC++コンパイラのコンパイラ拡張で使用できますが、推奨されません。すべてのコンパイラがVLAをサポートしているわけではないので、移植性が限られています。また、コンパイル時に 'sizeof'の' const'-nessが残っています – user4581301

関連する問題