模板类的方法使用全局范围内的 typedef.编译器错误

Method of a template class uses a typedef from the global scope. Compiler bug?

本文关键字:typedef 范围内 编译器 错误 全局 方法      更新时间:2023-10-16

我在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 in DoOperation() 现在与 test.cpp 中的全局 typedef 匹配。

我的问题:为什么要编译?这是视觉C++错误还是标准行为?

我认为test.cpp在typedef之前包含test.h,所以它实际上是

#include "test.h"
typedef Image<char> ImageType;
void Test()
  {
  Operation<ImageType> op;
  op.DoOperation();
  }

像这样完成,它确实是一个错误,或者关于两阶段查找的标准不合格行为。不依赖于模板参数的名称应相对于模板的声明点进行解析。

我想这是已知的行为。