gpt4 book ai didi

c++ - 'using' 语句用 g++ 编译,用 clang 编译失败

转载 作者:可可西里 更新时间:2023-11-01 15:22:26 24 4
gpt4 key购买 nike

我有以下结构的代码(在现实中当然要复杂得多,尤其是“Base”是三行代码,但我试图捕获它的要点):

template <class T>
class A {};

template <class T>
class B {
public:
B(){};
};

template <class T>
class C : public B<A<T>> {
public:
using Base = B<A<T>>;
using Base::B;
};

static const C<int> c{};

代码可以通过 g++ 正常编译

g++ -c test.cpp -std=c++11

但是,使用 clang++ 我收到一条我不太理解的错误消息

clang++ -c test.cpp -std=c++11

test.cpp:14:14: error: dependent using declaration resolved to type without 'typename' using Base::B;

我的代码有什么问题吗?或者这是 clang 中的错误?

注:写using B<A<T>>::B;时它在两个编译器上都能很好地编译,但这并不是我的问题的真正解决方案。

编辑:clang版本为3.5.0,gcc版本为4.9.2

最佳答案

来自第 12.1 节:

Constructors do not have names

所以通常的限定查找规则不适用。相反,您必须依赖构造函数查找的特殊规则(第 3.4.3.1 节):

In a lookup in which function names are not ignored and the nested-name-specifier nominates a class C:

— if the name specified after the nested-name-specifier, when looked up in C, is the injected-class-name of C, or

in a using-declaration (7.3.3) that is a member-declaration, if the name specified after the nested-name-specifier is the same as the identifier or the simple-template-id’s template-name in the last component of the nested-name-specifier,

the name is instead considered to name the constructor of class C.

所以你当然可以写

using Base::Base;

代替

using Base::B;

您的原始版本应该在第一个要点下工作,但是当涉及到模板时,注入(inject)的类名会变得复杂。只需使用更简单的版本 Base::Base,它的可读性也更高。任何看到它的人都会立即知道您正在命名一个构造函数。

关于c++ - 'using' 语句用 g++ 编译,用 clang 编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27954940/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com