首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否需要输入名称?

是否需要输入名称?
EN

Stack Overflow用户
提问于 2015-05-31 05:18:33
回答 1查看 206关注 0票数 4

考虑一下守则:

代码语言:javascript
复制
#include <memory>

template <class T, class Deleter = std::default_delete<T>>
class unique_ptr_wrapper: public std::unique_ptr<T, Deleter>
{
public:
    using typename std::unique_ptr<T, Deleter>::unique_ptr;
    operator T* () const {return this->get();}
};

int main()
{
    unique_ptr_wrapper<int> upw{new int{42}};
}

g++5.1可以很好地编译它,尽管clang++会抱怨

错误:只允许标识符输入名称

我同意这里没有标识符,所以可能不需要typename。但这真的是被禁止的吗?编译器至少需要发出诊断信息吗?

编辑代码在没有typename的情况下被g++和clang++编译得很好。

UPDATE它似乎是一个g++错误,我报告了这里

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-31 05:33:37

类emphasis /p1,重点是:

为构造函数命名的使用声明(7.3.3),隐式声明了一组继承构造函数。

构造函数不是类型。

Tem.res/p3-4:

3当限定-id指的类型不是当前实例化(14.6.2.1)的成员,其嵌套名称说明符指依赖类型时,它必须以关键字typename作为前缀,形成类型名称-说明符。如果类型名称说明符中的限定-id不表示类型,则程序的格式不正确. 4.如果模板的专门化被实例化为一组模板参数,使由typename前缀的限定id不表示类型,则专门化的格式是错误的。通常的限定名查找(3.4.3)即使在typename存在的情况下也用于查找限定id。

类./p2:

在函数名不被忽略且嵌套名称说明符指定类C的查找中:

  • 如果在C中查找嵌套名称说明符后指定的名称是C的注入类名(第9条),或
  • 在作为成员声明的使用声明(7.3.3)中,如果嵌套名称说明符后面指定的名称与嵌套名称说明符最后一个组件中的标识符或简单模板id的模板名称相同,

相反,这个名称被认为是类C的构造函数的名称。

应用class.qual中找到的“常见限定名查找”规则,std::unique_ptr<T, Deleter>::unique_ptr为构造函数命名。它并不表示类型。因此,根据上面引用的temp.res,程序是不正确的(需要诊断).

换句话说,这似乎是GCC的错误(尽管Clang的错误信息也需要改进)。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30554119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档