cubson 対 extools
私は、今まさに英語で使用可能な cubson
を作り終えました。私は、いくらかの特徴をチェックし、それをダウンロードページに置き、そして、ドキュメントを書き始めるでしょう。cubson
は、モジュール開発者を支える良いツールのうちの 1 つになると思います。cubson は、 XC 2.1
の Legacy モジュールグループを開発するために使われました。あなたが XC 2.1
で見ることができるフレームワーク・プログラング・ライクなコードは cubson
によって生成されたものです。
cubson は、 exFrame & extools
と呼ばれる尊い犠牲の上に築かれています。exFrame は、 XOOPS2 のための mojavi2
ライクなシンプルなフレームワークと、易しいコンポーネントを持っていました。さらに、Ryujiさん意外は誰も
exFrame に興味を抱かなかったので、コード・ジェネレーター extools
を開発しました。それは、いくらかの開発物にとって有益でした。
しかし、それは、ベストではありません。
私は、 exFrame および extools に関する反省と共に cubson
を開発しました。まず初めに、cubson は、昨日説明された ActionFrame
のサブクラスであるシンプルなフレームワークを作ります。そして、データベースから、シンプル・フレームワークが受け入れ得る様々なクラスを作ります。
差異を見てください:
コンセプト
*
cubson はコンポーネントのサブクラスの代わりにインラインコードを生成します。
* extools は exComponent と呼ばれるコンポーネントのサブクラスを生成します。
基底クラス群
*
cubson
の場合、シンプルフレームワークの基底クラスはそれぞれのモジュールの中に作られます。従って、多くのコード・クローンが発生します。それはモジュール単位のカスタマイズに向いています。
* extools の場合、基底クラスは exFrame
に収録されています。それは差異と単位のカスタマイズに向いています。
ライブラリ
*
cubson の場合、開発者は exFrame のような多くのライブラリを使用できません。しかし、彼らは
XOOPS Cube プロジェクトで作られたいくつかのスマートなクラスを使うことができます。
* extools の場合、開発者は exFrame の多くの太ったライブラリを使うことができます。
XoopObject
*
cubson が生成したコードは XoopsSimpleObject と
XoopsObjectGenericHandler を使います。ご承知の通り、これらのクラスは
XoopsObject より良く、型安全です。
* extools が生成したコードは、 exXoopsObject と
exXoopsObjectHandler を使います。これらのクラスは XoopsObject
と比較してただのデブです。
ActionForm
*
cubson が生成したコードは XCube_ActionForm と XCube_Validator
を使います。これらのクラスはよく整理されています。
* extools が生成したコードは exActionForm を使います。 exActionForm
は XCube_ActionForm のための尊い犠牲でした……
テンプレート
*
Cubson は XoopsForm
とコンポーネントなしでテンプレートを構築します。デザイナーは容易にそれらを変更し得ます。
* extools
はコンポーネント・スタビライザとしてのテンプレートを生成します。それを変更することは困難です。
ツール同期
*
cubson
は1回の呼び出しで自動的に複数のコマンドを呼び出します。たとえば、ひとつのコマンドがメッセージカタログを要請すると、別のコマンドがそれを受け取ります。
* extools は1回で複数のコマンドを呼び出すことはできません。
開発言語
*
cubson は extoolsD.dll
の一部です。それはGUI版のためにC#で書かれています。cubson は extoolsD
プロジェクトにおける CUI フロントエンドです。C# はもちろん PHP ではありませんが、 PHP
プログラマが C# を使うことは容易なことです。
* extools は PHP プログラムです。PHP プログラマは容易にそれをカスタマイズし得ます。
環境
*
cubson は XOOPS Cube 2.1 専用です。
* extools はいくつかの XOOPS で動作します。
XOOPS Cube Legacy 2.1 系統図
XOOPS Cube2.1
アルファー3
はもうすぐやってきます。通知以外のすべてのXOOPS2
の特徴のほとんどが
Legacy
モジュールでエミュレートされます。いくつかの特徴はDelegate
によって実装されます。
例えば、backend.php
は一度削除されました。
古いバックエンドはニュースモジュールに依存しています。しかし、ニュースモジュールはXC2.1
パッケージから取り外してあります。
したがって、どんなものにも、バックエンドは有効ではありません。
そこで、それはDelegate
で再び書かれました。1File
Hacking
か、モジュールのデフォルトプリロードでモジュールのRSS
機能を加えることができます。
あなたは、Preload
メカニズムとDelegate
メカニズムを知っているので、新しいバックエンドを理解することができると思います。
ところで、あなたは、XOOPS Cube
がXOOPS
からフォークしたものではないことを知っていますか?
私たちはゼロからプログラムを作り始めました:
オフィシャル・ドキュメントには、間違ったコンテンツがありました。
私たちは、XOOPS 2.0.x
シリーズがXOOPS
Cube
に含められたと説明しました。
しかし、それは間違っています。 xoopscube.org
とxoopscube.jp
を始めたとき、私たちはホームページで「XOOPS
」を「XOOPS
Cube
」に取り替えました。それがオフィシャル・ドキュメントに間違った内容があった理由です。
事実はこのダイアログによって示されます。 XOOPS Cube
は新しいフィールドです。Legacy
モジュールはXOOPS Cube
で働いて、XOOPS2
JP
に関するいくつかの古いファイルを含み、そして、XOOPS2
JP
をエミュレートします。私たちは将来、Legacy
を捨てるつもりです。次のXOOPS
Cube
の新しいベースパッケージはXOOPS2
のコードを含まないでしょう。
オフィシャル・ドキュメントは現在、正しい説明に変更されました。
日本とアメリカの価格差
日本で翻訳された本は高価です。
私は多くのゲームプログラマがよく読むいくつかの本の価格差を調べました。
私は以下の本について調べました:
• Game Programming Gems series
• GPU Gems series
• The Cg Tutorial
• Real-Time collision detection
• Real-Time Shader Programming by Ron Fonser
それぞれの本の価格差は異なっています。なぜ?
あなたは、合衆国の書店は割り引きができますが、日本の書店は割り引くことができないのを理解する必要があります。
日本では、書店のバーゲンセールを見ることはできません。
それは価格差の原因の1
つです。
驚いたことに、日本のGems
シリーズは合衆国の価格の2
倍です。価格差をチェックしたので、私は、私が英語を読むことができませんが、オリジナルを買うつもりです。
私は Amazon.com
から Amazon.jp
を使っていくつかの本を買いました。アマゾンは少額の送料を要求するだけです。
Third Way
XOOPS Cube Developers Ring
は XOOPS
における Third Way
です。Xoops
オフィシャルは中央集権的です。そして、彼らは基金を設立しました。XOOPS Cube
オフィシャルは(幻想の)ヒエラルキー構造と、オフィシャルと 3rd Party
の違い(という感覚)を打ち砕こうとしています。誰も、オープンソースで政争を楽しみたいとは思いません。また、私たちは基金やNPO
を設立することに時間を費やしたいとも思いません。
私たちの理想は、ユーザがいくつかの基点となるXOOPS
ユーザ・グループサイトを造って、互いにコネクトすることです。「公式か?それとも非公式か?」そのような感覚はありません。または、ユーザは彼らのために彼らの公式サイトについて決めるでしょう。例えば、GIJOE
は XOOPS
と Cube
の公式サイトを訪問するのを止めるようになりました。しかし、彼はfabi
さんと彼の友人が造ったXoops
ユーザグループ日本に参加しています。
XC Dev Ring
は公式ともユーザ・グループとも異なっています。開発者を1
つのサイトにとどまらせることは難しいことです。これは、友人同士が
XOOPS
と XOOPS Cube
の如何にかかわらず相互に接続するという挑戦です。そして、それはXOOPS
ユーザのひとりである
minahito(
私)
によって始められました。したがって、公式も非公式もありません。私の振舞いが悪いなら、他のメンバーは私へのリンクを削除します。
そして、私がXOOPS Cube
から離れた後であっても、リングは保たれるでしょう。
ところで、XC Dev Ring "JP"
と XC Dev Ring "EN"
は異なっています。"JP
"
には、8
人の日本人メンバーがいます。
"EN"
には、英語を書く2
人の日本人メンバーがいます。Dev
Ring
は技術的メカニズムではないので、だれでも、自身の国または自分の言語で同様のRing
を造ることができます。もちろん、あなたが英語で書くなら、私とGIJOE
は英語のリングにあなたを歓迎します。もしくは、あなたは新しい友人リングを組立てることができます。
不完全なルール
- メンバーは RSS をブログかニュースの上で発行しなければならない。
- 開発の話題をときどき書いてください。
- 次のメンバーは前のメンバーの RSS を受け取らなければならない。
- 最初のメンバーは、環状構造のために、最後のメンバーの RSS
を受け取らなければならない。
オンラインヘルプを作ろう
XOOPS Cube Legacy 2.1 (XC 2.1)
は管理画面でヘルプビューアを実装しました。もともと$modversion['help']はXOOPS2で予約されていました。しかし、それは何処にも使用されませんでした。XC2.1では、開発者はヘルプドキュメントをモジュールに添付することができ、そして、ユーザはコントロールパネル上で直接そのドキュメントを読むことができます。
ドキュメントの添付方法
ヘルプドキュメントをあなたのモジュールに添付しましょう。
初めに、$modversion['help']
にインデックスファイル名を書いてください。このファイルは、ユーザがコントロールパネルのサイドメニューでヘルプをクリックしたときに、最初に表示されるページです。私は今回、それを"help.html"
と命名します。
次に実際の"help.html"
を
language/english
の中に作成してください。そうです、ヘルプビューアはマルチリンガルドキュメントに対応しています。もしあなたが、フランス語、スペイン語その他のドキュメントを持ちたいのであれば、それぞれの言語ディレクトリ内に同名のファイルを作ってください。
最後に、ドキュメントを書きましょう!
別のページにリンクする方法
ヘルプドキュメントはPHP
によって表示されます。ヘルプのURL
はPHP
アプリケーションのページのアドレスになるため、相対リンクで(ヘルプ内の)他のページにリンクすることは困難です。
しかし、ヘルプドキュメントは純粋なSmartyによってロードされ表示されます。そして、特別なSmartyのプラグインはURLに関するいくつかの問題を解決してくれます。
helpurl は、ヘルプビューアのみで使用されるSmartyモディファイアです。
他のページへリンクするために、ヘルプドキュメント内で次のようなURLを書いてください。
<a
href="<{'page2.html'|helpurl}>">The detail
of functions</a>
ドキュメントで画像を使う方法
同様の原因で、ヘルプドキュメント内で画像を(相対リンクで)使うことができません。この問題を解決するためにSmartyモディファイアのhelpimageを使うべきです。
画像ファイルを language/****/helpimages
ディレクトリに配置してください。キャプチャーイメージは各言語の文字を含むため、ヘルプビューアは、ドキュメントと同様にマルチリンガルなイメージファイルに対応しています。それから
img タグを次のように書いてください:
<img
src="<{'screenshot01.jpg'|helpimage}>"
alt="..." />
イメージ・ファイルがユーザが指定した言語のディレクトリに存在していないなら、モディファイアはenglish
ディレクトリからデフォルトのイメージ・ファイルを手に入れようとします。
したがって、あなたは大量のイメージ・ファイルをすべての言語のために作成する必要はありません。
規則
私たちは、ヘルプのために特別なCSS
を準備する計画を立てています。開発は原則そのCSS
に従ってください。
現在のヘルプビューアの外観は調整されていません。デザイナーは、XC2.1
アルファー4でCSS
をクールに調整して、その規則を発表するでしょう。
The concept of Delegate (3)
C#
は、デリゲートをイベントとして用います。イベントは、 C#
の優れたフィーチャーのひとつであり、コンポーネントにおいてイベント・ドリブンなプログラミングのために使われています。
XOOPS Cubeも、イベントの概念を持っています。しかし、それはデリゲートとイベントを区別しません。私は、コアチームはデリゲートについてクラス設計を変更する計画を持っていると書きました。その計画は、XOOPS
Cubeにこれらの概念を分離させるということです。将来、このエントリのサンプル・コードが動作しないであろうことに注意してください。
さて、 XOOPS Cube
のイベントを学びましょう。現在、XOOPS Cube
のイベントは、デリゲートと同じものです。あなたは、デリゲートとしてあなたの関数をイベントに登録することができ、そして、そのイベントが発生したとき、イベントはあなたのデリゲートを呼びます。
例えば、ユーザーがログインに成功すると、Module.User.Login.Successイベントが発生します。その引数は、
XoopsUser
オブジェクトです。実際、デフォルトのデリゲートのうちのひとつは、オブジェクトの最終ログイン時刻に現在の時間を記録します。あなたは、デリゲートとしてのあなたの関数をこのイベントに追加できます。
日本のユーザーの間でポピュラーなセキュリティ・ハックがあります。それは、特定の IP
を除いて、管理者としてのログインを許可しないという機能を持っています。このハックは、会社や、管理者のパスワードが盗まれたケースへのガードに有効です。XOOPS2
においては、そのハックは、直接 common.php
、または、 admin.php
に書かれなければなりませんでした。XOOPS Cube Legacy 2.1
においては、ユーザーがログインに成功したときに、デリゲートを使うことで自前の関数を実行できます。あとは、あなたの関数が、特定のIP以外を跳ね返せばよいのです。
あなたは、それを
Site.Login に登録すべきです。もしアタッカーがセッションハイジャックを行えば、彼は
Module.User.Login.Success を通過しないかも知れません。しかし、
"Site.Login" は、常に呼ばれます。
if
(!defined('XOOPS_ROOT_PATH'))
exit();
define("ALLOW_AS_ADMIN_IP",
"127.0.0.1");
class IPChecker
extends
XCube_ActionFilter
{
function preBlockFilter()
{
$delegate
=&
new XCube_Delegate("IPChecker",
"siteLogin");
$this->mController->mRoot->mEventManager->add("Site.Login",
$delegate);
}
function siteLoginSuccess(&$sender,
&$eventArgs)
{
//
//
Delegate doesn't know own turn. Call static function
// of
the user module to login.
//
if
(!is_object($eventArgs->mXoopsUser))
{
UserCommonEventFunction::Login($sender,
$eventArgs);
}
//
// If
the current user is guest, return.
//
if
(!is_object($eventArgs->mXoopsUser))
{
return
$eventArgs;
}
//
// If
the current user is a administrator, check IP.
//
if
($eventArgs->mXoopsUser->isAdmin()
&&
$_SERVER['SERVER_ADDR']
!= ALLOW_AS_ADMIN_IP)
{
$_SESSION
= array();
$sender->executeForward(XOOPS_URL
.
"/");
die();
}
return
$eventArgs;
}
}
このファイルを
XOOPS_ROOT_PATH/preload/IPChecker.class.php
に保存してください。
さて……このような機能は
XOOPS Cube
の本体に含めることが可能です。しかし、一部の人のみが必要とするリクエストが、どれくらいあるでしょうか? 一体だれが、これらのコードを取り込んで、管理して、メンテナンスできるでしょうか? 肥満プログラムは、えてして良好なメンテナンスを失いがちです。私達は、小さなコアを選択しました。それはそれほど多くの機能を内蔵していません。しかし、プリロードとデリゲートは新しいハック手段と共有をもたらすでしょう。
ユーザーのアイデアは、しばしばコアを超越します。そして、ユーザーは、これらのアイデアのうち必要なものだけをセットすることができるのです。
The concept of Delegate (2)
デリゲートは、本質的にコールバック・メカニズムです。デリゲートによって、コールバック・プログラミングの全ての長所を利用することができます。交換可能性においては、クラス継承もデリゲートと同様に役に立ちます。したがって、クラス継承とデリゲートを区別して使い分けることが、重要になってくると思われます。そのために、クラス継承とデリゲートの特性の違いを理解する必要があるでしょう。
以下のクラスを見てください。

- PMMonitor
と呼ばれているこのクラスは、1週間読まれていないプライベートメッセージを持つユーザーをリストアップして、彼らにメールを送ります。
- このクラスを使用するコードは、ブロックに含まれています。
- その機能は、ブロックをサイトに置くことによって動作中になります。
言い換えると、プログラム・カウンタは、このクラスのコードを通過(実行)します。
さて、あなたは、このクラスが管理者に CC
を送ることができるならば、それが自分にとってより便利になると考えました。そして、あなたはサブクラスを定義して、CC
を送るために基底クラスをオーバーライドしました。

しかし、それは動作しません。他のコードが、あなたが新作したサブクラスの名前を知らないため、そのサブクラスは、どこからも呼ばれません。言い換えると、プログラムカウンタは決してこのサブクラスを通過しません。あなたがサブクラスのインスタンスを作成するコードで、基底クラスのインスタンスを作る元のコードを取り替えるまで、あなたのサブクラスは機能しないでしょう。
クラス継承は、プログラム上で開発者に機能を交換する可能性をもたらします。しかし、それはソースコードの変更を必要とします。
PMMonitor
がデリゲートを持っていれば、機能を交換するか、機能を加えるためにそれを活用することができます。この場合、サブクラスを定義して他の箇所のソースコードを変更する必要はありません。
デリゲートを持つクラスが「PMMonitorDash
」であると仮定しましょう。PMMonitorDash
は、固定機能の代わりにデリゲートを使います。したがって、 PMMonitorDash
のデリゲートにあなたの関数を登録すれば、あなたのコードが PMMonitorDash
で働くことになります。

XOOPS Cube
ではカスタマイズするために基本クラス群を取り替えることができます。それは、最も抜本的な改造方法ですが、しかし、ハードワークでもあります。ユーザーは、それを最後の手段と呼ぶかもしれません。その点、デリゲートは
XOOPS Cube
で最も簡単な改造方法になるでしょう。
The concept of Delegate (1)
デリゲートは、 XOOPS Cube
における新しいフィーチャーです。それは、統一的なコールバック手続きということになります。開発者は関数と同様にそれを使うことができます。そして、それは、交換可能性をもたらします。しかし、私達は
XOOPS Cube 2.1 RC
バージョンまでに Delegate
に関するいくらかのクラスの設計を変える予定です。この計画は、このエントリシリーズのサンプルソースコードに関する問題を誘発します。
デリゲートは、C#、D言語
、及び、いくらかのプログラミング言語のが持つフィーチャーです。それは、ファンクションポインタのようなものです。ご存じのように、プログラムは、コンピュータの原始時代からファンクションポインタのようなものを使用してきました。それは、アドレスレジスタによって指定されるアドレスへのジャンプです。
本来であれば、 XOOPS Cube
が、 PHP
でコールバックのための手続きを定義する必要はありません。PHP
は、コールバックのための関数を持っており、そして、プログラマはいくつかの方法をコールバックに使うことができます。しかしながら、プログラマが彼のすべての関数にプラグイン・メカニズムの実装を試みるのであれば、彼はプログラミングと説明に多大な時間と努力を払わなければなりません。
プログラマは、プラグインファイルをロードし、関数をチェックし、コールバックを実行するプログラムを組まなければなりません。プラグイン・メカニズムを持ついくらかの
XOOPS
モジュールを見てください。これらのモジュールのコールバックのための方法は、すべて異なります。そして、もし、コールバックについて設計されていないモジュールへプラグイン・メカニズムを付け加えるならば、それは大変な作業になるでしょう。
デリゲートはは、統一されたコールバック手続きによってこれらの問題を解決します :
- プログラマは、彼の関数を C# と同様に、デリゲートに変更できます。
- プラグイン開発者は、 XCube_Delegate
メカニズムのみ学習すれば大丈夫です。
-
プラグイン・ファイルをロードすることについて考える必要はありません。(プリロードメカニズムを思い出してください)
モジュール開発者は、最初にコールバックなしでプログラムを完成させることができます。次に、リファクタリング・ツール、もしくは、手動によって通常の関数をデリゲートに変更します。この2ステップによって、交換可能なモジュールが、今まさに完成しました
!
もし、コアがデリゲートとしてのトラックバック関数を持っているのであれば、ユーザーは、それをモジュール、または、
1 File Hackings
が持つ他の関数と交換し得ます。私は、デリゲートなしの XOOPS Cube
を想像できません。デリゲートは、コア開発、モジュール開発、カスタマイジングにとって便利です。
Doxygen (1)
私たちはいくつかのすばらしいツールからドキュメンテーションツールを選ぶことができます。あなたがオープンソース作業でそれを使用するなら、Doxygenはあなたのための最高のアプリケーションであるかもしれません。それは十分、有名なアプリケーションです。
Doxygenのすごい特徴は複数のプログラム言語をサポートするのが可能であるということです。
C、C++、Java、Objective-C、パイソン、IDL、PHP、C#そしてDからドキュメントを作るので、Doxygenはほとんどのオープンソースプロジェクトの役に立ちます。あなたは、あなたが新しいオープンソースプロジェクトをダウンロードした後にすぐ生成したドキュメントでソースコードを読み始めることができます。
また、Doxygenは、あなたのプログラムの設計に関する考えをクリアにするために使用されます。
IDEスクリーンの上で汚いコードを再考することは難しいことです。Doxygenと一杯のコーヒーは、それを簡単にします。
私は、Doxygenが私たちに良い理由が、C++の良いUMLモデリング・ツールがないということであると思います。私が何らかのツールで私たちのソースコードからUMLダイアログを生成しようとしたとき、それは深いクラスを分析することができませんでした。高価なツールもまた時折いくつかのクラスを見逃しました。そして、複雑なクラステンプレートは役に立つダイアログを決して生成しません。C++(または、PHP)の場合、Doxygenによって作られたドキュメントはUMLツールで作られたダイアログより私たちに有益です。
Doxygenは良いのですが、この事情はC++でプログラムを作らなければならない私たちにとって深刻な問題であるかもしれません。
XOOPS Cube環境のための3つのWinアプリ
私は XOOPS Cube
のためのいくつかの Windows
アプリケーションを開発しています。
For Development
私はcuboson
とcubson
GUI Force
をリリースするつもりです。
Cubson GUI Force
はcubson
のGUI
版です。
それは私が考える新しいモジュール開発スタイルを実現します。Cubson
CUI
はプログラムを作るのを楽しむプログラマーのために作られています。しかし、Cubson
GUI
はXOOPS
Cube
を楽しみたがっているすべての人のためのおもちゃです。
Cubson GUI Force
は私が長い間求めていたものになるでしょう。しかし、それは十分ではありません。私は設計段階からRAD
のために設計されている理想的なCMS
を求めています。
私は次回、それについて書くつもりです。
特別なDLL
を使用するので、現在、Cubson
はクローズソースです。私はcubson
の最新のソースコードからそれを既に取り除きました。しかし、まだコンパイルに対して完全ではありません。
For Destribution
ディストリビューターはXOOPS
Cube
の新しい重要な存在です。それはユーザ・グループの一種です。彼らは、彼らが望む1つのベース・モジュールといくつかのモジュールから成るオリジナルのパッケージを配布します。それらはユーザの中心になるでしょう。
彼らのためにパッケージを自動的に作成する特別なツールが必須になります。そして、それは GUI
ツールであるべきです。
彼らがマウスだけでパッケージを作成することが可能なツールが存在しないならば、ディストリビューション・グループは現れないでしょう。
For Management
自動アップデートのための手段はしばしば検討されます。それらのうちの1つはPEAR
のような仕組みです。それは、いい方法であり、だれかによって作られるでしょう。私が考える手段は、FTP
プロトコルを直接使って、最新のプログラムを手に入れて、それをユーザのサーバにプットする自動メンテナンス・アプリケーションです。サーバのパーミッションに関する設定が必須ではないので、初心者にとって、そのようなアプリケーションはお手頃だと考えます。もちろん、このアプリケーションの目標は、GUI
とマウス専用です。

すべてのモジュールとテーマは、自己の情報をそのようなアプリケーションに示すために、package.ini.php
というファイル名のマニフェストを持つようになるでしょう。テーマには、マニフェストが既に導入されてます。しかし、マニフェストの形式はまだフィックスしていません。
Express edition はOSSの姿勢を変えるか?
ご承知のとおり、VisualStudio Express edition
は無料ダウンロードになりました。
いくらかのオープンソースプロジェクトが、コンパイラのサポートに関する姿勢を変えるように思えます。
あなたはVisualStudio.NET C++ Express
を使う際に.NET
を気にする必要はありません。無料のVisualStudio.NET
C++
でも、CLR(VM)
なしで実行可能なネイティブコードをビルドすることができます。[1]
OSS
プロジェクトは gcc
、Code::Blocks
、VisualStudio
C++ 6
などのフリーのコンパイラ、IDE
、および古い環境へのサポートを要求されがちです。しかし……今や
OSS
プロジェクトが、VisualC++ 2003
以下の古い IDE
をサポートする必要があるでしょうか? VisualStudio Express
edition
は、microsoft
の最新コンパイラを持っています。
VisualC++ 6
は古いコンパイラです。開発者はテンプレートを使うコードをうまく書くことができないケースがあります。私はMarijuana
さんからこの問題を聞いたとき、とても驚きました。なんと、次のようなコードを書くことができないのです:
std::List<SceneNode>::iterator
itr = ...
このコードは構文エラーを引き起こします。信じられません……これではSTL
を用いたプログラムを書くことは事実上不可能です。開発者は、この制限を避けるのに'typedef'
を使用しなければなりません。
typedef
std::List<SceneNode>
SCENENODE_LIST_T;
SCENENODE_LIST_T::iterator
itr = ...
VC++6
が現役だった頃に、VisualStudio
シリーズを使ったことがなかったので、私はこの問題を知りませんでした。
もちろん、gcc
やCodeWarrior
などでは、このような問題には遭遇しません。
VisualC++
6のこのような制約の下では、STLの本格的な使用は困難です。OSSプロジェクトが古いVisualC++のサポートを諦めるなら、彼らはこの制限から自分たちのソースコードを解放することができます。OGREプロジェクトは以下の意見を発表しました:
Lastly, if you use Visual C++, note that we have
dropped support for old versions and officially
support only VC7.1 (.Net 2003) and VC8 (.Net 2005)
with this release. The standards support in older
versions of VC++ (especially VC6) was just too bug
ridden to tolerate any longer since it was
constraining our development, and the upgrade path
to VC8 Express is free, so there is no reason to
continue to use outdated versions. You also have
the choice of Code::Blocks.
これは正しい判断のように思えます。
[1]このケースでは、プロジェクトを構成する際に「マネージコードの使用」にチェックを入れてはいけません。