Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GCC中的不同模板错误格式?_C++_Templates_Gcc - Fatal编程技术网

C++ GCC中的不同模板错误格式?

C++ GCC中的不同模板错误格式?,c++,templates,gcc,C++,Templates,Gcc,对于某些模板错误消息,GCC具有非常详细的格式: ... some_class<A,B,C> [with int A = 1, int B = 2, int C = 3] 。。。某些类[整数A=1,整数B=2,整数C=3] 有没有机会让它显示以下内容: ... some_class<1,2,3> 。。。某个班级 否,除非您愿意维护GCC源代码的私有分支 虽然对于类模板来说,这样做是合理的,但是函数模板可能会相互重载,并且对于同一个函数有不同的模板参数列表。那么后一种

对于某些模板错误消息,GCC具有非常详细的格式:

... some_class<A,B,C> [with int A = 1, int B = 2, int C = 3]
。。。某些类[整数A=1,整数B=2,整数C=3]
有没有机会让它显示以下内容:

... some_class<1,2,3>
。。。某个班级

否,除非您愿意维护GCC源代码的私有分支


虽然对于类模板来说,这样做是合理的,但是函数模板可能会相互重载,并且对于同一个函数有不同的模板参数列表。那么后一种类型的错误将是不明确的。

否,除非您愿意维护GCC源代码的私有分支


虽然对于类模板来说,这样做是合理的,但是函数模板可能会相互重载,并且对于同一个函数有不同的模板参数列表。那么后一种类型的错误将是不明确的。

您将无法跟踪专业化来自哪个模板:

template<int A, int B> class X {
  void f();
};

template<int A> class X<A, 2> {
  void f();
};

int main() {
  X<1, 2>().f();
  X<2, 1>().f();
}
模板类X{
无效f();
};
模板类X{
无效f();
};
int main(){
X().f();
X().f();
}
GCC输出

m.cpp: In function 'int main()':
m.cpp:6:12: error: 'void X<A, 2>::f() [with int A = 1]' is private
m.cpp:10:19: error: within this context
m.cpp:2:12: error: 'void X<A, B>::f() [with int A = 2, int B = 1]' is private
m.cpp:11:19: error: within this context
m.cpp:在函数“int main()”中:
m、 cpp:6:12:错误:“void X::f()[with int A=1]”是私有的
m、 cpp:10:19:错误:在此上下文中
m、 cpp:2:12:错误:“void X::f()[int A=2,int B=1]是私有的
m、 cpp:11:19:错误:在此上下文中

如果只是说
X
X
,您将丢失此诊断包含的重要信息。

您将无法跟踪专业化来自哪个模板:

template<int A, int B> class X {
  void f();
};

template<int A> class X<A, 2> {
  void f();
};

int main() {
  X<1, 2>().f();
  X<2, 1>().f();
}
模板类X{
无效f();
};
模板类X{
无效f();
};
int main(){
X().f();
X().f();
}
GCC输出

m.cpp: In function 'int main()':
m.cpp:6:12: error: 'void X<A, 2>::f() [with int A = 1]' is private
m.cpp:10:19: error: within this context
m.cpp:2:12: error: 'void X<A, B>::f() [with int A = 2, int B = 1]' is private
m.cpp:11:19: error: within this context
m.cpp:在函数“int main()”中:
m、 cpp:6:12:错误:“void X::f()[with int A=1]”是私有的
m、 cpp:10:19:错误:在此上下文中
m、 cpp:2:12:错误:“void X::f()[int A=2,int B=1]是私有的
m、 cpp:11:19:错误:在此上下文中

如果只是说
X
X
,您将丢失此诊断包含的重要信息。

使用选项-fno pretty templates。这符合您的要求,并且还省略了默认模板参数。

使用-fno pretty templates选项。这就是您想要的,并且还省略了默认的模板参数。

前一种格式的信息量更大。毫无疑问,我并不是说它一般都不好。不过,它很快就会变得不可读。顺便说一句,它可以显示如下内容:
X
&
X
,以标记哪些参数来自显式专门化。前一种格式无疑提供了更多信息,我并不是说它通常是坏的。不过,它很快就会变得不可读。顺便说一句,它可以显示如下内容:
X
&
X
来标记哪些参数来自显式专门化;来自手册:当错误消息引用类模板的专门化时,编译器将忽略与该模板的默认模板参数匹配的任何模板参数。如果这两种行为中的任何一种使错误消息更难理解,而不是更容易理解,则可以使用-fno pretty templates来禁用它们。请尝试编译此简单程序,使用或不使用此选项。main(){vector v;v.pop_back();}。选项-fno pretty templates从错误消息中删除[with T=int]等;来自手册:当错误消息引用类模板的专门化时,编译器将忽略与该模板的默认模板参数匹配的任何模板参数。如果这两种行为中的任何一种使错误消息更难理解,而不是更容易理解,则可以使用-fno pretty templates来禁用它们。请尝试编译此简单程序,使用或不使用此选项。main(){vector v;v.pop_back();}。选项-fno pretty templates从错误消息中删除[with T=int]等。