4

可能重复:
我必须在哪里以及为什么要放置“模板”和“类型名称”关键字?

当我尝试在 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;
};
4

1 回答 1

9

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

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

这在此 SO post的已接受答案中得到了很好的解释。

于 2013-01-26T12:58:10.173 回答