如何解决此声明是否确实改变了错误所表示的含义?
这是我的代码:
namespace ns {
template<typename T>
struct Utility {
};
struct Concrete {
using Utility = Utility<Concrete>;
};
}
我有一个模板类ns::Utility
和一个类ns::Concrete
,它指定实用程序的类:ns::Concrete::Utility
。现在应该可以使用具体的类自己专用的实用程序。
适用于MSVC,但GCC会产生错误:
错误:声明“ using Utility = struct ns :: Utility” [-fpermissive]使用Utility = Utility;
错误:更改 “ struct ns :: Utility” [-fpermissive]
中“ Utility”的含义
要解决这一问题,我可以指定名称空间,以明确消除ns::Concrete::Utility
和ns::Utility
的歧义:
namespace ns {
template<typename T>
struct Utility {
};
struct Concrete {
using Utility = ns::Utility<Concrete>;
};
}
但是实际上,我在初始代码中没有看到歧义性,也没有看到任何其他问题会使编译器抱怨。我也不想用命名空间明确指定完整的类名:这会使代码的灵活性降低(例如,如果我决定重命名命名空间怎么办?)
标准怎么说,我的代码应被视为错误吗?
更新:使用using Utility = ::Utility<Concrete>;
的建议不起作用(因为可能同时存在::Utility
和ns::Utility
),我仍然必须完全指定包括名称空间的类型。因此,我可以同意g ++会尝试避免在using
/ typedef
之前和之后在同一个类中使用两个定义的情况,但是完全指定类名的需求非常烦人。而且,即使我指定了全名,在这种情况下g ++也会产生错误:
struct Concrete {
Utility<int> u1;
using Utility = ns::Utility<Concrete>;
Utility u2;
};
为什么在我不使用相同的Concrete::Utility
名称在同一范围内不同时使用ns::Utility
和Utility
的情况下进行有效的重新定义?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。