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 in 匹配test.cpp

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

4

1 回答 1

3

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

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

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

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

我想这是已知的行为

于 2012-06-08T11:42:12.757 回答