C++ 模板类作为参数模板:MSVC错误-错误C2977:模板参数太多(C+;+;98)
我需要在MSVC(C++98)中构建代码。我声明了一个带有模板类参数的模板类。结果是,在MSVC编译期间,我遇到了一个错误: 错误C2977:“集”:模板参数太多 Gcc很好地构建了这段代码 您可以自己尝试: 这是您的代码: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
#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
是一个完全限定的名称,因此它只能引用命名空间范围内的模板