2

私はVC2010にコードを持っていますが、それを小さな例に減らしました。

Test.h:

#pragma once

template <typename TPixel>
struct Image
  {
  typedef TPixel PixelType;
  };

template <typename TImageType>
struct Operation
  {
  void DoOperation()
    {
    ImageType::PixelType value = 0;   
// I've done a misprint here. It should be TImageType::PixelType
    }
  };

Test.cpp:

void Test()
  {
  typedef Image<char> ImageType;

  Operation<ImageType> op;
  op.DoOperation();
  }

予想通り、エラーが発生します。

test.h(14): error C2653: 'ImageType' : is not a class or namespace name

test.cppそれでは、少し変更してみましょう。

typedef Image<char> ImageType;

void Test()
  {
  Operation<ImageType> op;
  op.DoOperation();
  }

これでコンパイルされます!驚いたことに、ImageTypeinDoOperation()はのグローバルtypedefと一致するようになりましたtest.cpp

私の質問:なぜそれがコンパイルされるのですか?それはVisualC++のバグですか、それとも標準の動作ですか?

4

1 に答える 1

3

typedefの前test.cppに含まれているので、実際にはtest.h

#include "test.h"
typedef Image<char> ImageType;

void Test()
  {
  Operation<ImageType> op;
  op.DoOperation();
  }

このように完了すると、これは確かにバグ、または2フェーズルックアップに関する標準の不適合動作です。テンプレートパラメータに依存しない名前は、テンプレートの宣言ポイントを基準にして解決する必要があります。

これは既知の動作だと思います

于 2012-06-08T11:42:12.757 に答える