模板模板参数的参数是否会导致阴影?

时间:2016-03-02 10:18:41

标签: c++ templates shadowing template-templates

这是合法的C ++吗?

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

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

2 个答案:

答案 0 :(得分:7)

没有。 [temp.local]/6

  

template-parameter 不得在其范围内重新声明   (包括嵌套范围)。

答案 1 :(得分: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...
}