8

这是合法的 C++ 吗?

template <typename T, template <typename T> class>
struct S { };

Clang(3.7.1)拒绝它,抱怨第二个T阴影第一个T。GCC 似乎并不关心它,我认为这是合理的。我认为只有参数数量在模板模板参数中很重要。

4

2 回答 2

7

编号[temp.local]/6

不应在其范围内重新声明模板参数(包括嵌套范围)

于 2016-03-02T10:28:18.917 回答
0

虽然存在正确的答案,但我需要一些时间才能理解,我只想添加一个示例:

template <class Key, class T>
class MyData {
public:
    // ...

    template <class Key, class T>
    inline static MyData<Key, T> *get(MyMap<Key, T> *ptr)
    {
        return NULL: // Logic here...
    }

    // ...
}

作为“ Template-parameters shall not be re-declared within its scope (including nested scopes)”,上述get(..)方法应更改并使用其他名称,例如:

template <class KeyType, class Type>
inline static MyData<KeyType, Type> *get(MyMap<KeyType, Type> *ptr)
{
    return NULL: // Logic here...
}
于 2021-01-30T12:03:59.323 回答