1

もっと良いコンパイラがあることはわかっていますが、私は vc6 を使い続けることを好みました。

問題のコンパイラは次のとおりであることに注意してください:
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
(リンカなどは関係ないので、この質問には関係していないようです)

std::vector から継承するクラスを宣言しようとしましたが、2 番目のテンプレート パラメーターを具体的に定義しようとしない限り、正常に動作します。

10: class foo : public std::vector<LPTSTR,std::allocator<LPTSTR>>
11: {
12:   public:
13:   foo();
14:   ~foo();
15: };

はコンパイルされず、次のエラーが発生します: c:\foo\foo.h(10) : エラー C2143: 構文エラー: '{' の前に '>' がありません

さて、本当の問題は、なぜこれが合法なのかということです:

10: class foo : public std::vector<LPTSTR,std::allocator<LPTSTR>>> 
11: {
12:   public:
13:   foo();
14:   ~foo();
15: };

10行目の最後の余分な部分に注意してください>...そして私が知りたいのは:

  1. は何か間違ったことをしましたか?
  2. これは私のインストールでのみ発生しますか?
  3. 後で何らかの問題が発生する可能性があるため、回避策を控えるべきですか?

私はこれを可能な限り調査しようとしましたが、ほとんどのプログラマーはオンラインで検索するのがそれほど簡単ではないことを知っています。なぜなら、検索エンジンは正規表現検索さえなければ、ヒットまたはミスおよび/または人気コンテストになるからです。グーグルなどでランクアップするほど人気の話題です)。

この件に関する迅速な(または迅速でなくても)返信をいただき、誠にありがとうございます。私は他人の質問に答えるのがとてつもなく簡単に思えても、答えようとし、知識は常に知識不足から始まることを忘れないようにしています。

4

2 に答える 2

5

おそらく、コンパイラが>>期待どおりにシンボルを解析していないことを意味します。つまり、この点で C++11 をサポートしていません。

これを試して

std::vector<LPTSTR,std::allocator<LPTSTR> >
                                         ^ note space

また、標準ライブラリ コンテナーから継承するのが得策ではない理由についてもお読みください。

「なぜ >>> が合法なのか」という質問については、C++03 でも C++11 でもまったく合法ではありません。それはあなたのコンパイラの機能であるとしか言えません。

于 2012-05-08T10:13:21.917 に答える
4
class foo : public std::vector<LPTSTR,std::allocator<LPTSTR>>

>>は1 つのトークンとして扱われ、閉じ括弧をスペースで区切る必要があるため、コンパイルされません。これは C++11 で修正されました。

また、std コンテナはそのために設計されていないため (たとえば、仮想デストラクタがないなど)、std コンテナから継承しないでください。

于 2012-05-08T10:13:25.600 に答える