私の状況は以下の通りです:テンプレート関数のオーバーロードは
私は値の状況を処理し、手動でポインタを扱うかさえnew
することなく、NULL可能なされているオブジェクトのテンプレートラッパを持っています。これは、基本的にはこれに沸く:
null_t
ダミーに対してチェックできる比較演算子と今
struct null_t
{
// just a dummy
};
static const null_t null;
template<class T> class nullable
{
public:
nullable()
: _t(new T())
{}
nullable(const nullable<T>& source)
: _t(source == null ? 0 : new T(*source._t))
{}
nullable(const null_t& null)
: _t(0)
{}
nullable(const T& t)
: _t(new T(t))
{}
~nullable()
{
delete _t;
}
/* comparison and assignment operators */
const T& operator*() const
{
assert(_t != 0);
return *_t;
}
operator T&()
{
assert(_t != 0);
return *_t;
}
operator const T&() const
{
assert(_t != 0);
return *_t;
}
private:
T* _t;
};
その値を必要とし、自動変換を行います。
このクラスは、私が問題を遭遇するまで、かなりの間、私をよく援助してくれました。私はすべてのファイル(この場合XML)に出力されるいくつかの構造体を含むデータクラスを持っています。
だから私は、それぞれが適切なデータとXML-DOMを埋めるこれら
xml_iterator Add(xml_iterator parent, const char* name,
const MyDataStruct1& value);
xml_iterator Add(xml_iterator parent, const char* name,
const MyDataStruct2& value);
のような機能を持っています。これも正しく動作します。
今すぐ、しかし、これらの構造体の一部がコードに
nullable<MyDataStruct3> SomeOptionalData;
として宣言され、そしてこのような場合に対処するためにどの、オプションであり、私は、テンプレートのオーバーロードを作った:
template<class T>
xml_iterator Add(xml_iterator parent, const char* name,
const nullable<T>& value)
{
if (value != null) return Add(parent, name, *value);
else return parent;
}
で私のユニットがコンパイラをテストすると、期待通りに、値または構造体がnullable<T>
にラップされている場合に、常にこのテンプレート関数を選択することを推奨します。
しかし、前述のデータクラス(独自のDLLでエクスポートされています)を使用する場合は、何らかの理由で最後のテンプレート関数を呼び出す必要があります。nullable<T>
からそれぞれのタイプT
への自動変換が行われます。このケースを処理するための関数を完全にバイパスします。私は上記の言ったように - すべてのユニットテストは、罰金100%に行きました、両方のテストやコードを呼び出す実行可能ファイルは、デバッグモードでMSVC 2005によって構築されている - 問題は間違いなく違いをコンパイラに帰することはできません。
更新:オーバーロードされたAdd
関数はエクスポートされず、DLL内でのみ使用されます。言い換えれば、この問題が発生した外部プログラムであっても、テンプレートオーバーロードされた関数で頭が含まれていません。それはテンプレートバージョンを見つけたが、フィットし、他の機能、例えば、あなたのタイプの基本クラスを使用して1以上のテンプレート「完全一致」を選択する前
名前空間を定義していますか?あなたの定義はどの名前空間にありますか?そして、図書館のこと? – T33C
堅牢で完璧なソリューションのためには、 'boost :: optional'を見てみてください。 – GManNickG
@GMan:はい、それは 'nullable'と非常によく似ていますが、' boost :: optiona'は同じ自動変換動作をしているので、手元で問題を解決できません。 – Mephane