無料化された「Visual C++ 2005 Express Edition」(VCEE)は、前回触れたように、Microsoft固有のATLとMFC(クラス階層)をサポートしていません。いくつかの回避策を講じれば、それらのMicrosoft固有のクラス階層を利用できるようになるようですが、はっきり申し上げれば、そのようなことはどうでもよいことでしょう。Microsoftの固有クラス階層を再利用したければ、上位版開発環境製品を購入するのが筋であり、開発現場では当然そうしているはずです。
さて皆さん、無料提供のVCEEに何を期待しますか。筆者は、標準仕様への準拠意欲です。この投稿記事はたいへん面白い問題点を提起しています。投稿記事には、次のようなソースコードが掲載されています。
#include <iostream>
class FooClass
{
public:
FooClass(const std::string _str):data(_str){};
~FooClass(){};
std::string data;
};
void FooBar(const FooClass& cls)
{
std::string data = cls.data + "abc";
}
int main(void)
{
FooClass cls("abc");
FooBar(cls);
return 0;
}
記事の投稿者は、このソースコードをVCEE環境でビルドするとエラーが出ると主張しています。その主張に対して、ドイツ人VC++ MVPであるRichter氏は、自分の環境ではエラーを再現できない!、と回答しています。ところが、別の人は"エラーが出る"と主張し、議論が白熱していきます。筆者もこのソースコードをVCEE環境でビルドしてみましたが、エラーが出ました。そして、次のようにソースコードの一部を修正することにより、正常にビルドできるようになりました。
#include <iostream>
#include <string> // Added By Takashi Toyota
class FooClass
{
public:
FooClass(const std::string _str):data(_str){};
~FooClass(){};
std::string data;
};
void FooBar(const FooClass& cls)
{
std::string data = cls.data + "abc";
std::cout << data.data() << std::endl; // Added By Takashi Toyota
}
int main() // Changed by Takashi Toyota
{
FooClass cls("abc");
FooBar(cls);
return 0;
}
議論は加熱し、途中参加の投稿者とMicrosoftのコンパイラー開発者間の感情的な議論にまで発展します。"C++標準仕様に準拠していない!"、"いや、標準仕様はそこまではっきり述べていない!"などのやり取りが2人の間で交わされます。筆者はその議論の様子を静かに見守っていたのですが、次のようなことを感じないわけにいきませんでした。
"交わされているのは技術詳細であり、それほど意味のあることではない。そもそもこのような発想に乏しいC++ソースコードを書くべきではないのではないか!"
筆者なら、おそらく、次のような、あくまでも"標準ライブラリ提供クラスベースの"コードを書くことでしょう。
#include <iostream>
#include <string>
class FooClass
{
public:
FooClass(const std::string _str):data(_str){};
~FooClass(){};
std::string data;
};
void FooBar(const FooClass& cls)
{
std::string data = " abc";
data.insert(0,cls.data.data());
std::cout << data.data() << std::endl;
}
int main()
{
FooClass cls("abc");
FooBar(cls);
return 0;
}
皆さんは、どのようなソースコードを書きますか?なお、上記ソースコード内のdata()メソッドについては、こちらの記事が参考になるかもしれません。