【问题标题】:Template class as parameter template: MSVC error - error C2977: too many template arguments(C++98)模板类作为参数模板:MSVC 错误 - 错误 C2977:模板参数过多(C++98)
【发布时间】:2020-04-07 18:54:48
【问题描述】:

我需要在 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();
}

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

【问题讨论】:

    标签: c++ templates visual-c++ compiler-errors c++98


    【解决方案1】:

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

    new IteratorCollectionTest&lt;Set, TItem&gt;() 出现在类模板Set 的范围内。所以 MSVC 假定 Set 参数不引用模板。它假定名称指的是 specialization,即Set&lt;TItem&gt; 类型。因此在需要模板名的地方传递了一个类名。

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

    解决方法是限定名称。

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

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

    【讨论】:

      猜你喜欢
      • 2012-01-06
      • 1970-01-01
      • 2018-06-17
      • 2018-12-03
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 2010-12-22
      • 1970-01-01
      相关资源
      最近更新 更多