【发布时间】:2013-12-02 11:07:09
【问题描述】:
如何解决此 clang 警告?这在包含 STL <set> 并且另外具有模板化 set() 函数的代码中经常出现。
我不想全局禁用警告,但也不想手动为每个包含 <set> 的文件(太多)。
template<typename T> struct set{};
template<typename T> struct trait { typedef const T& type; };
struct Value {
template<typename T> void set(typename trait<T>::type value) {}
};
void foo() {
Value v;
v.set<double>(3.2);
}
clang.cpp:8:9:警告:在成员访问表达式中查找“set”不明确;使用“值”的成员 [-Wambiguous-member-template]
v.set(3.2);
^
clang.cpp:4:29:注意:在对象类型“值”中的查找指的是这里
模板无效集(类型名称特征::类型值){}
^
clang.cpp:1:29: 注意:从当前范围查找指的是这里
模板结构集{};
^
生成 1 个警告。
显而易见的解决方案是不使用模板化的 set() 方法,但这似乎相当有限。
【问题讨论】:
-
如何正确使用命名空间并避免使用命名空间标准?
-
你用的是哪个版本的clang?
-
@DyP:来自 SVN 的 release_34
-
@MartinRichtarsky 我认为整个问题已经在DR 1111 中得到解决,它具有 FDIS 状态 - AFAIK 现在是标准的一部分。因此,您应该将警告解释为C++03 中的格式错误,现在允许且明确。了解这一点,您可能希望按照 n.m. 的建议禁用警告