gpt4 book ai didi

c++ - 模板类作为参数模板: MSVC error - error C2977: too many template arguments(C++98)

转载 作者:行者123 更新时间:2023-12-02 07:36:41 25 4
gpt4 key购买 nike

我需要在 MSVC(C++98) 中构建我的代码。我使用模板类参数声明一个模板类。结果我在 MSVC 编译期间收到错误:错误 C2977:“设置”:模板参数太多

Gcc 很好地构建了这段代码。

你可以自己尝试一下: https://godbolt.org/z/YJXLX7

这是代码:

#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();
}

我做错了什么?有人可以帮助我吗?

最佳答案

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

new IteratorCollectionTest<Set, TItem>()出现在类模板的范围内 Set 。因此 MSVC 假设 Set参数不引用模板。它假设名称指的是特化,类型为 Set<TItem> 。因此,在需要模板名称的地方传递一个类名称。

这是 C++98 规定的行为。此行为已在 C++11 中进行了修改,其中作为模板参数出现的模板名称并不引用注入(inject)的类名称。在 C++11 及更高版本中,GCC 将接受该代码。但是当强制 C++98 模式时,it complains too .

解决方法是限定名称。

Iterator* createIterator() { return new IteratorCollectionTest<::Set, TItem>(); }

::Set是一个完全限定名称,它只能引用命名空间范围内的模板。

关于c++ - 模板类作为参数模板: MSVC error - error C2977: too many template arguments(C++98),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59337506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com