こんばんは、
現在、VC++6.0を使っています。VC++.NETをちょっとだけ使ってみましたが、IDEが大幅に(?)変更されており、とまどっております。
という状況なのですが、いくつか教えてください。
Q.NETに乗り換えてうれしかったこと。
Q尚も6.0を使っている場合、その理由。
Q.NETのIDEがわかる良い参考書。
どうぞよろしくお願いいたします。
> .NETに乗り換えてうれしかったこと。
- それを見つけるために乗り換えた。
- 異なる言語間で呼んだり呼ばれたりできる。
- VC6は言語仕様が旧く、思ったコードが書けない。
- C, C++, C++/CLI, C#, VB.NET, J# を一つの環境で遊べる。
> .NETのIDEがわかる良い参考書。
いぢくり倒してカラダで覚える。僕はね。
# 要は「慣れ」。
επιστημηさん、ありがとうございます。
>- VC6は言語仕様が旧く、思ったコードが書けない。
興味が沸く一文です。
私はこれまで C++ を使えば「何でも」できると思ってきました。
一例で結構です、どのようなコードでしょうか?
>いぢくり倒してカラダで覚える。僕はね。
私もはじめは、クリックの連発でやってみようとしましたが、思うような進歩が得られず諦めました。で、こちらに泣き付いた次第です。
何卒よろしくお願いいたします。
> 一例で結構です、どのようなコードでしょうか?
言語仕様の細かいとこだから、どのようなと訊かれても困ります。
言語仕様に従った正しいコードが通らないとか、挙動が仕様通りでないとか。
VC6はずいぶん昔に捨てたので「こんなのはダメ」な例が出てきません。
> 一例で結構です、どのようなコードでしょうか?
一例だと,部分特殊化とか。
# VC++.NETではなくVC++.NET 2003になってしまいますが。
#include <iostream>
#include <typeinfo>
template <typename T> class Foo
{
public:
static void Output ()
{
std::cout << typeid(T).name() << std::endl;
}
};
template <typename T> class Foo<T *> // l.13
{ // l.14
public:
static void Output ()
{ // l.17
std::cout << "Pointer to ";
Foo<T>::Output(); // l.19
}
}; // l.21
int main ()
{
Foo<int *>::Output();
return 0;
}
---- VC++ 6.0 (コンパイルエラー) ----
test.cpp(21) : error C2989: 'Foo<class ?? ::T *>' : このテンプレート クラスはすでに非テンプレート クラスとして定義されています。
test.cpp(21) : error C2988: 認識できないテンプレートの宣言または定義です。
---- VC++.NET (コンパイルエラー) ----
test.cpp(13) : error C2065: 'T' : 定義されていない識別子です。
test.cpp(13) : error C2059: 構文エラー : '>'
test.cpp(14) : error C2143: 構文エラー : ';' が '{' の前にありません。
test.cpp(17) : error C2143: 構文エラー : ';' が '{' の前にありません。
test.cpp(19) : error C2687: 列以外でテンプレート クラスの入れ子の UDT を定義できません。
test.cpp(19) : fatal error C1903: 直前のエラーを修復できません。コンパイルを中止します。
---- VC++.NET 2003 (出力) ----
Pointer to int
VC++6.0のコンパイラはC++の規格書への準拠率が低いため、
最新のC++言語の本に載っているような記述が出来ない部分が結構あります。
但し、それが無いから使い物にならないと言うようなレベルではなくて
そういう使い方が出来ないと言うだけの話です。
実装方法そのものを捻じ曲げないといけないほどの物ではないと私は思っています。
(もしかしたら捻じ曲げないといけないくらいおかしいと思っている人もいるかもしれませんけれど)
未だにVC++6.0を使っているのは、以前の資産のメンテナンス上必要だったからなんですが、
既にサポートが打ち切られているので新しい環境への移行は必要と考えています。
VC++6だと、テンプレートクラス内で別の型のテンプレート関数が使えない、とか。
template<class T>
class CHoge{
public:
CHoge(const T& t);
template<class U>
void bar(const U& u);
};
なんてやろうとするとコンパイルエラーになっちゃいます。
このときは仕方なく、別の方法で実装しましたが。
# 本当は純粋なテンプレートで実装したかったのだけど。
私はVC6オンリーですが・・・
テンプレートとかの深いところを触らなければ滅多に問題は出ないです。(結構大きいかもしれないけど)
乗り換えない理由はMFC DLLを再配布しなくてもいいからとか.NETの利点がよくわからないとか^^;。
#MFC6.0だったらWinXPとかは最初から持ってるし・・・
>template<class T>
>class CHoge{
>public:
> CHoge(const T& t);
> template<class U>
> void bar(const U& u);
>};
以下のようにclass宣言中に関数定義まで書いたらVC6でも一応通りました。
template<class T>
class CHoge{
public:
template<class U>
void bar(const U& u){cout<<u<<endl;}
};
みなさんありがとうございます。
テンプレートにつきましては、それほど使ったことがありませんので、特段困ったことはありませんでした。
「ひとりだけでプログラミングする分には、6.0でも問題ない」「いろいろなレベルのプログラマーが大勢で開発する際に、差がでる」ということでしょうか?
「アセンブラだけで相当なアプリをコーディングした」なんて話もありますので、.NETの便利なところが判らないうちは6.0のままで、という感じもします。
もう少し検討してみます。
fukuさん
> 以下のようにclass宣言中に関数定義まで書いたらVC6でも一応通りました。
宣言だけならばOKですが、実際使うときにエラーが出ます。
使わなければ宣言しませんからね。
http://www.tietew.jp/cppll/archive/8428
Blueさん
>宣言だけならばOKですが、実際使うときにエラーが出ます。
a.bar(b)//OK
a.bar<int>(b)//NG
なるほど・・・型指定での呼び出しが通らないんですね。
引数からの暗黙指定しか使ったことがなかったので気付きませんでした(汗
私はVC6.0オンリーなのですが、VC++.NETに移行してない
理由は、下記の様な理由です。
注).NET系は体験版で使っただけで使用してません。
・用途がアプリ用のActiveXDLL作成で、アプリ側がVB6の
場合が多い。従って同じ時期のVC6を使用している。
逆にVC++.NETに移行したいなぁと感じるのは下記です。
・ATLでコレクション型を使用できる(はず・・・)
※多次元配列を渡すのにコレクション型を使いたい。
VC6でもコレクション型を自作すればできるが、
インターフェイスで自作型を使用したくないので。
こんな奴もいるって事で。
私は作業効率のアップかな……
(もちろんやり方にもよるとは思いますが)
# インテリセンス機能の改善がうれしかったり^^;
みなさん、ありがとうございます。
「ここが改善された」
「新たにこんなことができるようになった」
といった事柄を「簡潔に」、そしてできれば「漏れなく」、リストした資料といったものはないでしょうか?microsoft のサイトに有るのでしょうが・・・。
> Q.NETに乗り換えてうれしかったこと。
- ISO/IEC14882への準拠レベルが格段にあがった(既出
標準ライブラリのnamespaceさえまともに対応できてなかったですし、
template回り以外にもstd::bad_allocの挙動とか、wchar_tとか、
個別には上げ切れませんが。
- (派生して)VC6では動作できないコード(boostの一部ライブラリとか)が
遊べるようになった。
- インテリセンスが利口になった(既出
- grepの範囲に「Visual C++ インクルード ディレクトリ」とかある。
- C#がおまけでついてきた(VSproなので.....
> Q尚も6.0を使っている場合、その理由。
マイクロソフトもサポートを打ち切ったので、もう消えて欲しいのが本音。
# 持ってはいますが、個人だと掲示板回答時の検証くらいにしかもう...。
> Q.NETのIDEがわかる良い参考書。
使って覚えたのでわかりません。
完全な資料は知りませんが、このあたりとか?表現の粒度は大きいですけど。
http://msdn.microsoft.com/vstudio/previous/2003/overview/whatsnew.aspx
http://msdn.microsoft.com/vstudio/previous/2003/faq/default.aspx
http://msdn.microsoft.com/vstudio/Previous/2002/documentation/default.aspx
http://msdn.microsoft.com/vstudio/Previous/2002/faq/default.aspx
後はなれですかね。私も最初は戸惑いましたが、今となっては戻りたくないです。
> 後はなれですかね。私も最初は戸惑いましたが、今となっては戻りたくないです。
うぉーそんなもんですかねぇ。
私の場合は、仕事も自宅も VC6 です。
VS2005出たことだし、自宅の環境をかえようかなぁ。。。
(VC2005Expressは入れてあるが)
職場のほうは現プロジェクトが終わるまで当分VC6でいきそうですが。
IDEとしてのVC6はまだ何とか許容できるかもしれませんが、
「10年から昔の古いツールの制限により、書きたい正しいコードが書けない」
というフラストレーションが私にはいやです。
C++の標準だと他には、
class foo
{
static const int BAR=1; // これが通る(意味を無視した単体enumは嫌い
};
あと、IDE的にも、「保留中のチェックイン」ウィンドウが結構便利とか、
純粋仮想やデフォルト引数持ち関数でもちゃんとツリーから関数に跳べるとか、
「定義の表示」もほぼ失敗しないとか。
ツイート | ![]() |