0

ある種のテンプレート再定義エラーが発生しています。これは解決を妨げるエラーではありません (回避策を見つけました) が、コードが間違っている理由を理解したいと思います。

template <typename RandomEngine, typename RandomDistribution = std::uniform_int_distribution<int> >
struct base_random_generator {
    RandomEngine generator;
    RandomDistribution distribution;
    base_random_generator(RandomEngine gen, 
                          RandomDistribution dist = RandomDistribution(0, 10))
        : generator(gen), distribution(dist) { }
    int operator()() {
        return distribution(generator);
    }
};

base_random_generator< std::mt19937 >
create_mt_generator(std::mt19937::result_type seed = std::mt19937::default_seed) {
    return base_random_generator< std::mt19937 > (std::mt19937(seed));
}

Visual Studio 2010 は、次のエラーで上記のコードをコンパイルできません。

... main.obj で既に定義されています

致命的なエラー LNK1169: 1 つ以上の複数定義されたシンボルが見つかりました

ただし、create_mt_generator 関数を削除すると、エラーはなくなり、すべて正常に戻ります。私の主なアイデアは、std::function のように動作する構造体を渡して、ランダムな整数を取得するために何度も呼び出すことができるようにすることです。

その関数は次のようになります。

template <typename Container, typename RandomGenerator>
void scramble(Container c, RandomGenerator rand) { }

ユーザーが指定したパラメーターを使用して、その場でランダムジェネレータークラスを作成できる必要があると思いました。

4

1 に答える 1

1

ヘッダー ファイルでは、特定のタイプの関数のみを定義する必要があります。

  • inline
  • template
  • static

それ以外の場合はすべて、定義を 1 つのコンパイル単位だけに置き、ヘッダー ファイルで前方宣言 (プロトタイプ) を使用して、他のコンパイル単位から見えるようにします。

于 2013-04-06T04:42:21.690 に答える