Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.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++ C++;运算符逗号/前向参考代码不';不编译_C++ - Fatal编程技术网

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*)
?当注释行未注释时,它为什么工作?编译器的错误输出是怎么说的?您可能想提及哪个编译器,以防有多个编译器。我们从另一端开始吗?您是否能够找到一个参考,根据标准,建议代码应该编译?