Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板类作为参数模板:MSVC错误-错误C2977:模板参数太多(C+;+;98)_C++_Templates_Visual C++_Compiler Errors_C++98 - Fatal编程技术网

C++ 模板类作为参数模板:MSVC错误-错误C2977:模板参数太多(C+;+;98)

C++ 模板类作为参数模板:MSVC错误-错误C2977:模板参数太多(C+;+;98),c++,templates,visual-c++,compiler-errors,c++98,C++,Templates,Visual C++,Compiler Errors,C++98,我需要在MSVC(C++98)中构建代码。我声明了一个带有模板类参数的模板类。结果是,在MSVC编译期间,我遇到了一个错误: 错误C2977:“集”:模板参数太多 Gcc很好地构建了这段代码 您可以自己尝试: 这是您的代码: #include <iostream> #include <vector> class Iterator { public: virtual int size() = 0; }; template <template<typ

我需要在MSVC(C++98)中构建代码。我声明了一个带有模板类参数的模板类。结果是,在MSVC编译期间,我遇到了一个错误: 错误C2977:“集”:模板参数太多

Gcc很好地构建了这段代码

您可以自己尝试:

这是您的代码:

#include <iostream>
#include <vector>

class Iterator
{
public:
    virtual int size() = 0;
};

template <template<typename> class TContainer, class TType>
class IteratorCollectionTest
    : public Iterator
{
public:
    virtual int size() { m_collection.size(); }

private:
    TContainer<TType> m_collection;
};


template<typename TItem>
class Set
{
public:
    Set();

    Iterator* createIterator();
    int size();

protected:
    class SetInstance;

private:
    SetInstance*    m_instance;
};

template<typename TItem>
class Set<TItem>::SetInstance
{
public:
    Iterator* createIterator() { return new IteratorCollectionTest<Set, TItem>(); }
    int size() { return  m_vec.size(); }

public:
    std::vector<TItem>  m_vec;
};

template<typename TItem>
Set<TItem>::Set()
    : m_instance(new SetInstance())
{
}

template<typename TItem>
Iterator* Set<TItem>::createIterator()
{
    return m_instance->createIterator();
}

template<typename TItem>
int Set<TItem>::size()
{
    return m_instance->size();
}

int main()
{
    Set<int> m_serr;
    Iterator* iter = m_serr.createIterator();
}
#包括
#包括
类迭代器
{
公众:
虚拟整数大小()=0;
};
模板
类迭代器集合测试
:公共迭代器
{
公众:
虚拟整数大小(){m_collection.size();}
私人:
t集装箱m_系列;
};
模板
类集
{
公众:
Set();
迭代器*createIterator();
int size();
受保护的:
类SetInstance;
私人:
SetInstance*m_实例;
};
模板
类集合::SetInstance
{
公众:
迭代器*createIterator(){返回新的迭代器集合测试();}
int size(){return m_vec.size();}
公众:
std::向量m_-vec;
};
模板
Set::Set()
:m_实例(新SetInstance())
{
}
模板
迭代器*集合::createIterator()
{
返回m_instance->createIterator();
}
模板
int Set::size()
{
返回m_实例->大小();
}
int main()
{
设置m_serr;
迭代器*iter=m_serr.createIterator();
}
我做错了什么?
有人能帮我吗?

类模板有一个特殊的成员,名为。在类模板的范围内,模板名称代表当前的专门化。它不代表模板

new IteratorCollectionTest()
出现在类模板
Set
的范围内。因此,MSVC假定
Set
参数不引用模板。它假定该名称指的是专门化,即
Set
类型。并因此在需要模板名的位置传递类名

这是C++98规定的行为。此后,这种行为在C++11中得到了修改,其中显示为模板参数的模板名称并不引用注入的类名。在C++11和更高版本的模式下,GCC将接受代码。但是当强制C++98模式时

解决方法是限定名称

Iterator* createIterator() { return new IteratorCollectionTest<::Set, TItem>(); }
Iterator*createIterator(){返回新的IteratorCollectionTest();}
由于
::Set
是一个完全限定的名称,因此它只能引用命名空间范围内的模板