C++ visualc&x2B+;C+;中的好友模板类出错+;11

C++ visualc&x2B+;C+;中的好友模板类出错+;11,c++,c++11,visual-c++,g++,clang++,C++,C++11,Visual C++,G++,Clang++,我有一段与g++/clang++一起工作的代码。最近有报道说它与Visual C++有冲突。 代码如下: namespace q { template <typename X, typename Y> struct A {}; } template <typename X> struct B { template <typename Y> friend struct q::A; }; int main() { ret

我有一段与g++/clang++一起工作的代码。最近有报道说它与Visual C++有冲突。

代码如下:

namespace q {
    template <typename X, typename Y>
    struct A {};
}

template <typename X>
struct B {
    template <typename Y>
    friend struct q::A;
};

int main() {
    return 0;
}
名称空间q{
模板
结构A{};
}
模板
结构B{
模板
友元结构q::A;
};
int main(){
返回0;
}
VC++返回以下错误:

source_file.cpp(9): error C2976: 'q::A': too few template arguments
source_file.cpp(3): note: see declaration of 'q::A'
source_file.cpp(10): note: see reference to class template instantiation 'B<X>' being compiled
source_file.cpp(9):错误C2976:“q::A”:模板参数太少
source_file.cpp(3):注意:参见'q::A'的声明
source_file.cpp(10):注意:请参阅对正在编译的类模板实例化“B”的引用

谁是对的?有没有一种可移植的方法可以做到这一点?

正确编写模板参数应该有助于:

template <typename X, typename Y>
friend struct q::A;
模板
友元结构q::A;

请注意,错误地将
A
声明为友元会导致程序格式错误,不需要进行诊断。

我希望实现的是仅将
q::A
声明为友元,其中
X
模板参数与所包含的
B
类相同。我现在意识到我写的东西可能不会达到我的目的,我想要的可能是部分专业化,这是被禁止的。我是对的,还是有办法做到这一点?@Svalorzen[]()