c ++使用嵌套模板类来传递类型信息

时间:2013-01-26 12:50:23

标签: c++ templates

  

可能重复:
  Where and why do I have to put the “template” and “typename” keywords?

当我尝试在VS 2012中编译以下代码时,我从Consumer类的typedef行开始出现错误:

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

这是编译器的问题还是代码不再有效c ++? (它的提取项目肯定用于构建没有问题的旧版本的VS - 和gcc iirc - 但那是大约10年前!)

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;
};

有一种解决方法,但我只是想知道是否应该这样做:

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;
};

1 个答案:

答案 0 :(得分:8)

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

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

this SO post的接受答案中已经很好地解释了这一点。