C++ C++;应为嵌套名称说明符

C++ C++;应为嵌套名称说明符,c++,C++,我在'ClassB'之前得到了错误预期的嵌套名称说明符,但我不知道为什么。 这里是A级: #include "ClassB.h" template<typename T class A { //implementation friend class B; }; #包括“ClassB.h” 模板在B::method1的声明中有很多语法错误,所以我猜您希望B::method1接受类型为A的参数 在这种情况下,您的classA.h: template<typename T class A

我在'ClassB'之前得到了错误
预期的嵌套名称说明符
,但我不知道为什么。 这里是A级:

#include "ClassB.h"
template<typename T
class A
{
//implementation
friend class B;
};
#包括“ClassB.h”

模板在
B::method1
的声明中有很多语法错误,所以我猜您希望
B::method1
接受类型为
A
的参数

在这种情况下,您的
classA.h

template<typename T
class A
{
    //implementation
    friend class B;
};
#include "ClassA.h"
class B
{
    template<typename T>
    void method1(A<T> varName) {}
}

第一个文件中存在语法错误。在模板参数之后,角括号未闭合。该行中应该是
template

除此之外,你们不能相互包含这样的HeaderFile。想想编译器在这里必须做什么-它读取第一个头文件,然后尝试从第二个头文件读取所有源代码(因为它包含),然后尝试从第一个头文件再次读取所有源代码(因为它包含在第二个头文件中)

至少从我在示例代码中看到的情况来看,您可以通过从第一个文件中删除
#include“classB.h”
并简单地向
classB
添加一个转发声明来解决这个问题。所以这些文件看起来像:

class B; // Forward declaration.

template <typename T>
class A
{
friend B;
...
};
B类;//远期申报。
样板
甲级
{
朋友B;
...
};
#包括“ClassA.h”
B类
{
样板
void method1(一个varName){}
}

链接器会将转发声明链接到正确的
classB

我不知道错误,但想说明一下,上面的示例似乎是一个循环依赖性问题,即两个
.h
文件相互包含。您有很多错误。例如
ClassA
很可能只是
A
(或者
ClassA
?)。你想用
::struct
部分做什么?我试图通过删除类A中的include语句来改变这一点,但现在它说调用method1()@AdrianMole没有匹配的函数。我正在使用struct作为方法的参数
class B; // Forward declaration.

template <typename T>
class A
{
friend B;
...
};
#include "ClassA.h"
class B
{
template<typename T>
void method1(A<T> varName) {}
}