1

私は(可能性のある)VC6(私は知っています。それは私たちが使用しているものです。)コンパイラエラーに遭遇したと思いますが、私が何か馬鹿げたことを見逃したという事実を受け入れています。次のコードが与えられます(これは単なる例です!):

#include <iostream>

// Class with template member function:
class SomeClass
{
public:
  SomeClass() {};

  template<class T>
  T getItem()
  {
    return T();
  };
};


// Dummy just used to recreate compiler error
class OtherClass
{
public:
  OtherClass() {};
};

std::ostream& operator<<( std::ostream& oStr, const OtherClass& obj )
{
  return oStr << "OtherClass!";
};

// Main illustrates the error:
int main(int argc, char* argv[])
{
  SomeClass a;

  OtherClass inst2 = a.getItem<OtherClass>(); // Error C2275 happens here!
  std::cout << inst2 << std::endl;

  return 0;
}

このコードVC6をコンパイルしようとすると、次のようになりますa.getItem<OtherClass>()

Error C2275: 'OtherClass' : illegal use of this type as an expression

些細な構文の問題を見落としていませんか?私はルールを破っていますか?このコードは、gcc4.3.4で問題なくコンパイルされます。それはVC6のさらに別のコンプライアンスの問題ですか?

ありがとう!

4

3 に答える 3

2

単語が含まれている他の多くのものの中templateで、VC6は、テンプレートパラメーターが関数パラメーターでもない関数テンプレートを処理できませんでした。一般的な回避策は、ダミーの関数パラメーターを追加することでした。

  template<class T>
  T getItem(T* /*dummy*/ = NULL)
  {
    return T();
  } // note: no ; after function definitions

ただし、一般的に、VC6はかなり不完全であり、TUにtemplateキーワードが含まれるとすぐにチョークすることがよくあります。私は数年間それに対して頭を悩ませなければならず(いくつかのコンパイラ/コンパイラバージョンでコンパイルされた大きなコードベース; VC6は私たちに無限の問題を与えました)、2003年にそれを取り除いたときはとても嬉しかったです。

于 2010-09-21T22:27:29.840 に答える
1

これはVC6の問題である可能性があります。VC6はほとんどの基本的なテンプレートを正しくコンパイルしますが、より高度なテンプレートの使用に移行し始めると、多くの問題が発生することが知られています。メンバーテンプレートは、VC6が適合性に弱いことが知られている領域です。

于 2010-09-21T20:52:29.373 に答える
1

これはVC6のもう1つのバグだと思います。実際には、より最新のコンパイラに切り替える必要があります。

于 2010-09-21T20:52:29.927 に答える