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

c++ using nested template classes for carrying type information

本文关键字:类型 信息 嵌套 C++      更新时间:2023-10-16

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

当我尝试在VS 2012中编译以下代码时,我在消费者类的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;
};

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

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

这在这篇 SO 帖子的接受答案中得到了很好的解释。