私は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();
}
これでコンパイルされます!驚いたことに、ImageType
inDoOperation()
はのグローバルtypedefと一致するようになりましたtest.cpp
。
私の質問:なぜそれがコンパイルされるのですか?それはVisualC++のバグですか、それとも標準の動作ですか?