【发布时间】:2015-03-13 08:16:42
【问题描述】:
我有以下结构的代码(在现实中当然要复杂得多,尤其是“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++ 编译良好p>
g++ -c test.cpp -std=c++11
但是,使用 clang++ 时,我收到一条我不太明白的错误消息
clang++ -c test.cpp -std=c++11
test.cpp:14:14:错误:依赖使用声明解析为没有“类型名称”的类型 使用 Base::B;
我的代码有什么问题吗?或者这是 clang 中的错误?
注意:在编写 using B<A<T>>::B; 时,两个编译器都可以正常编译,但这并不是我的问题的真正解决方案。
编辑:clang 版本是 3.5.0,gcc 版本是 4.9.2
【问题讨论】:
-
使用继承构造函数时,
using命名构造函数,而不是类型,所以typename是错误的。无论如何,using Base::Base应该可以工作 - 名称查找中有一个特殊规则将其解析为构造函数。 coliru.stacked-crooked.com/a/5e01aeb4d26b312e -
感谢您的解释。
using Base::Base是我生产代码的一个很好的解决方案。但是,问题仍然是using Base::B是否有效。对我来说,错误提及typename表明clang 有问题。但是,我不是 C++ 专家。 -
是的,这看起来像一个 clang 错误。没有理由对
using B<A<T>>::B;和using Base::B;区别对待。 -
谢谢,我已经提交了错误报告,并将相应地更新这个问题:llvm.org/bugs/show_bug.cgi?id=22242
-
@user2188211:所以回答你自己的问题并接受,然后:-)
标签: c++ compilation g++ clang