C++使用嵌套模板类来携带类型信息

c++ using nested template classes for carrying type information

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Where and why do I have to put the"template" and"typename" keywords?

当我试图在vs 2012中编译以下代码时,我在consumer类的typedef行中得到错误,从以下代码开始:

1
error C2143: syntax error : missing ';' before '<'

这是编译器的问题还是代码不再有效C++?(该项目是从中提取的,当然用于在旧版本的vs-和gcc-iirc上无问题地构建,但那是大约10年前的事了!)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct TypeProvider
{
  template<class T> struct Container
  {
    typedef vector<T> type;
  };
};

template<class Provider>
class Consumer
{
  typedef typename Provider::Container<int>::type intContainer;
  typedef typename Provider::Container<double>::type doubleContainer;
};

有一个解决办法,但我只是想知道是否需要:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct TypeProvider    
{
   template<typename T> struct Container { typedef vector<T> type; };
};

template<template<class T> class Container, class Obj>
struct Type
{
  typedef typename Container<Obj>::type type;
};

template<typename Provider>
class TypeConsumer
{
  typedef typename Type<Provider::Container, int>::type intContainer;
  typedef typename Type<Provider::Container, double>::type doubleContainer;
};

您需要帮助编译器知道Container是一个模板:

1
2
3
4
5
6
template<class Provider>
class Consumer
{
  typedef typename Provider:: template Container<int>::type intContainer;
  typedef typename Provider:: template Container<double>::type doubleContainer;
};

这在这篇文章的公认答案中得到了很好的解释。