C++ C++;运算符逗号/前向参考代码不';不编译
除非注释行未注释,否则不会编译以下代码:C++ C++;运算符逗号/前向参考代码不';不编译,c++,C++,除非注释行未注释,否则不会编译以下代码: template <class T> struct R { static T& r(); }; struct M { static char m(M&); template <class T> static int m(const T&); }; template <class T> struct A; template <class T> struct B {
template <class T> struct R { static T& r(); };
struct M {
static char m(M&);
template <class T> static int m(const T&);
};
template <class T> struct A;
template <class T>
struct B {
struct U { };
struct V { M& operator,(U); };
enum { v = sizeof(M::m((R<V>::r(), R<A<T>*>::r()))) };
};
template <class T> struct A { B<T> y; };
int main()
{
// A<int>(); // Works if uncommented.
B<int>();
}
模板结构R{static T&R();};
结构M{
静态字符m(m&);
模板静态int m(常数T&);
};
模板结构A;
模板
结构B{
结构U{};
结构V{M&算子,(U);};
枚举{v=sizeof(M::M((R::R(),R::R()))};
};
模板结构A{B y;};
int main()
{
//A();//如果未注释则有效。
B();
}
在逗号运算符处,编译器认为它需要A
才能完成,即使代码只在A*
中传输。我不明白为什么。它在使用clang和g++时都失败。叮当声说
h.cpp:13:36: error: field has incomplete type 'B<int>'
template <class T> struct A { B<T> y; };
^
h.cpp:11:38: note: in instantiation of template class 'A<int>' requested here
enum { v = sizeof(M::m((R<V>::r(), R<A<T>*>::r()))) };
^
h.cpp:17:5: note: in instantiation of template class 'B<int>' requested here
B<int>();
^
h.cpp:8:8: note: definition of 'B<int>' is not complete until the closing '}'
struct B {
^
1 error generated.
h.cpp:13:36:错误:字段的类型“B”不完整
模板结构A{B y;};
^
h、 cpp:11:38:注意:在这里请求的模板类“A”的实例化中
枚举{v=sizeof(M::M((R::R(),R::R()))};
^
h、 cpp:17:5:注意:在这里请求的模板类“B”的实例化中
B();
^
h、 cpp:8:8:注意:直到结束“}”时,“B”的定义才完整
结构B{
^
生成1个错误。
我现在正坐在调试编译器的调试器中:-)我想现在发生的是,编译器正在使用依赖于参数的查找来查找匹配的
运算符,
s以及指向类的指针的关联类和名称空间包括类本身,因此编译器希望类是完整的。也许。您得到了如果将main更改为以下内容,则会显示相同的错误消息:
int main()
{
// A<int>(); // Works if uncommented.
auto& x = R<A<int>*>::r();
B<int>();
}
intmain()
{
//A();//如果未注释则有效。
auto&x=R::R();
B();
}
我想说的是,正如你所暗示的。提到一个指向a
的指针不会导致a
的模板扩展
(对我来说)这是有意义的,因为这与提到一个指向前向声明类型的指针是一样的——此时不需要完全定义类型
也许比我聪明的人可以在标准中找到这一段。那么你的问题是什么?为什么它不编译?为什么编译器在查看
运算符时希望A
是完整的,(B::V,A*)
?当注释行未注释时,它为什么工作?编译器的错误输出是怎么说的?您可能想提及哪个编译器,以防有多个编译器。我们从另一端开始吗?您是否能够找到一个参考,根据标准,建议代码应该编译?