2

外部ライブラリを使用する必要がありますが、std :: stringで呼び出された場合、次のテンプレート関数とその明示的な特殊化から「複数定義エラー」が発生します。

template <typename T>
void foo(T& value);

template <>
void foo(std::string& value);

2番目の関数をに変更しても

void foo(std::string& value);

問題は同じです。

[1]によると、少なくともテンプレートのないバージョン(「プレーンな古い関数」)は、テンプレートバージョンよりも優先されるべきです。

問題がどこにあるのか、誰かが手がかりを持っていますか?

[1] http://www.gotw.ca/publications/mill17.htm

4

1 に答える 1

3

単一定義規則に違反しています。

関数がinlineである場合を除き、定義できるのは1回だけです。関数をとしてマークするinlineと、定義が一致する限り、必要に応じて何度でも定義できます。テンプレート関数は暗黙的に動作するかのように動作するinlineため、テンプレートでエラーが発生することはありません。

ただし、明示的な特殊化または非テンプレート関数は暗黙的にではなくinline、複数の変換単位に含めるため、複数の定義を取得します。これはルールを破ります。次のようにマークする必要がありますinline

template <>
inline void foo(std::string& value);

(リンク時間より前にこれを取得している場合は、警備員を含める必要があります。)

于 2010-09-20T19:56:27.040 に答える