【问题标题】:Can a parameter of a template template parameter cause shadowing?模板模板参数的参数会导致阴影吗?
【发布时间】:2016-06-15 03:12:13
【问题描述】:

这是合法的 C++ 吗?

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

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

【问题讨论】:

  • 为什么要使用T两次?如果你想在第二个模板中使用T,你可以写template &lt;class T, template &lt;class S=T&gt; class&gt;
  • @DavidHaim 这不是强制性的,但是当第一个参数应该提供给作为模板模板的第二个参数时,使用相同(或至少相似)的名称是有意义的对于嵌套模板参数。您的建议很有趣,我从未尝试为模板模板参数指定默认参数。与template &lt;class T, template &lt;class S&gt; class&gt; 相比,它完成了什么?
  • 我想知道在帖子标题中搜索和销毁标签词的人的驱动动机是什么?他们是否同样热衷于将NULL 替换为nullptr
  • 可以与this question相关吗?
  • @DavidHaim 好的,用template &lt;template T, template &lt;class S=T&gt; class C&gt;,我们可以用C&lt;&gt; 替换C&lt;T&gt;,就好像C 是用默认模板参数定义的......这可以 在某些情况下很方便,但我不确定我是否会经常使用它。无论如何,非常感谢。

标签: c++ templates language-lawyer template-templates shadowing


【解决方案1】:

没有。 [temp.local]/6:

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

【讨论】:

  • 嗯,我花了一段时间才意识到您的报价实际上与我的案例相关,但是,它肯定是关于“嵌套范围”。
【解决方案2】:

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

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...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    相关资源
    最近更新 更多