未使用的模板方法中出错
error in unused template method
struct B
{
int a;
void foo() {a = 5;}
};
template <typename T>
struct A
{
A(int i) { B::foo(); }
A(double d) {}
};
int main()
{
A<int> a(5.0);
}
GCC 4.7.2 编译它没有错误。Clang 3.4svn 抱怨:
$ clang -Wall -Wextra test.cpp
test.cpp:10:16: error: call to non-static member function without an object argument
A(int i) { B::foo(); }
~~~^~~
代码当然是错误的,但是哪个编译器符合标准?
同样奇怪的是,如果您使用 5 而不是 5.0,clang 不会像 gcc 那样打印任何"实例化"注释:
$ gcc test.cpp
test.cpp: In instantiation of ‘A<T>::A(int) [with T = int]’:
test.cpp:15:12: required from here
test.cpp:9:13: error: cannot call member function ‘void B::foo()’ without object
你的程序不正确,两个编译器都是正确的,因为标准不需要来自符合要求的编译器的诊断(让 gcc 忽略它(。不能有有效实例化的模板(标准术语中的专用化(是不正确的,即使该模板从未实例化也是如此。
在您的情况下,A<T>::A(int)
中B::foo()
的名称是一个非依赖名称,因此需要在第一阶段查找期间解析它,并且它只能引用上面定义的B
类。因为它不是static
成员函数,而是非静态函数,所以无论用于实例化A<T>
模板的类型T
代码都是不正确的,并且程序格式不正确。
相关引用来自 14.6 [temp.res]/8:
知道哪些名称是类型名称可以检查每个模板定义的语法。不得对可生成有效专用化的模板定义发出诊断。如果无法为模板定义生成有效的专用化,并且未实例化该模板,则模板定义格式不正确,无需诊断。
相关文章:
- 将成员函数指针作为参数传递给模板方法
- 模板方法访问正向声明的类仅在没有此指针的情况下无法编译
- C++11:模板方法的模板函数调用无法编译?
- 如何从ECS中的模板方法获取组件?
- 使用 SFINAE 设计模板方法
- 一个模板方法,用于同时接受常量和非常量参数
- C++模板方法中的循环依赖关系
- 在 C++ 中使用模板方法重写类方法
- 类中的模板方法
- 基于枚举参数调用专用模板方法
- 模板中的模板方法 - 实例声明和类方法声明签名不同
- 可变参数模板方法
- 使用模板方法为标头提供空 cpp 时出现问题
- SFINAE 方法在 clang 中完全禁用基类的模板方法
- 将函数和成员函数传递给模板方法
- 从非模板类调用专用模板方法
- MSVC使用constexpr-if从可变模板方法中的基本模板参数中吞下const
- 依赖于特定类类型的C++模板方法
- 有没有办法仅在两个模板参数相同时才覆盖匹配的模板方法?
- 未使用的模板方法中出错