[Coherence] Upgrading to Coherence for C++ 12.1.2 and The "Ambiguous Compilation Error" in Types Derived From AbstractAggregator

原文はこちら。
https://blogs.oracle.com/middlewareplace/entry/upgrading_to_oracle_coherence_for

今週末、Coherence for C++ 3.7.1 APIを使って作成したいくつかの古いC++アプリケーションを数日前にリリースされた最新の12.1.2のAPIに移行し始めました。12.1.2ではCoherenceに対して多くの素敵な変更や機能が追加されています。インストール、WebLogicとの統合、TCMP、Exabus、RESTおよびCoherence*Extendといったような様々な領域で改善がなされていることは言うまでもありません。こうした変更や改善の詳細は以下のリンクからどうぞ。
Oracle Fusion Middleware Documentation
Release Notes for Oracle Coherence
http://docs.oracle.com/middleware/1212/coherence/COHRX/index.html
数時間で旧バージョンから最新バージョンに移行した後、ビルド時に以下のようなコンパイラメッセージが出てびっくりしました。
call of overloaded 'Float64Sum(const coherence::lang::TypedHandle<coherence::util::extractor::ReflectionExtractor &)' is ambiguous
同じコンパイラメッセージを見たことがあるなら…ご心配無用です。簡単かつ明快な解決策があります。このコンパイラエラーが発生したのは、Coherence for C++ APIの12.1.2で、ファクトリメソッドcreate()のオーバーロードバージョンが、coherence::util::aggregator::AbstractAggregatorクラスから派生した型に導入されたからです。

ver 3.7.1までは、AbstractAggregatorオブジェクトのインスタンスを作成するには、coherence::util::ValueExtractorのインスタンスをファクトリメソッドに渡すしかありませんでしたが、12.1.2からはcoherence::lang::String::Viewのインスタンスを渡してインスタンスを作成することもできるようになりました。このオブジェクトには集約された属性の名称が含まれているはずです。裏で自動的に、Coherence for C++ APIがcoherence::util::ValueExtractorを作ってくれます。

今回の場合、以下の部分を
Float64Sum::Handle scoreAggregator = Float64Sum::create(ReflectionExtractor::create("getScore")); 
次のように変更しました。
Float64Sum::Handle scoreAggregator = Float64Sum::create("getScore"); 
これでプロジェクトが再度コンパイル可能になり、GNU Linux G++でもMicrosoft Visual Studioの両方のC++のコンパイラを使うことができるようになりました。

このエントリがコードデバッグの手助けになることを希望します :-)

0 件のコメント:

コメントを投稿