考虑一下守则:
#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++错误,我报告了这里。
发布于 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条),或相反,这个名称被认为是类C的构造函数的名称。
应用class.qual中找到的“常见限定名查找”规则,std::unique_ptr<T, Deleter>::unique_ptr为构造函数命名。它并不表示类型。因此,根据上面引用的temp.res,程序是不正确的(需要诊断).
换句话说,这似乎是GCC的错误(尽管Clang的错误信息也需要改进)。
https://stackoverflow.com/questions/30554119
复制相似问题