可能重复:
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;
};
答案 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的接受答案中已经很好地解释了这一点。