以下代码无法编译,除非注释行未注释:
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>();
}
在逗号运算符中,编译器认为它需要A<int>
才能完成,即使代码仅在A<T>*
中传输。我不明白为什么。它与clang和g ++都失败了。 Clang说
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.
我现在正坐在调试器中调试编译器:-)我认为正在发生的事情是编译器正在使用依赖于参数的查找来查找匹配的operator,
以及指向的指针的关联类和命名空间类包含类本身,因此编译器希望类完整。也许
答案 0 :(得分:0)
A<int>
我会在这里走出去,说出你暗示的情况。提及指向A<int>
的指针不会导致intern-runner
的模板扩展。
这对我来说是有意义的,因为它与提及前向声明类型的指针相同 - 你不需要在那时完全定义的类型。
也许比我更聪明的人可以在标准中找到要求这一点的段落。