C++预期的嵌套名称说明符

C++ expected nested-name-specifier

本文关键字:说明符 嵌套 C++      更新时间:2023-10-16

expected nested-name-specifier before 'ClassB'收到错误,但我不知道为什么。 这是A类:

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

现在这里是 B 类,它利用了 A 类

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

但是,由于上面指定的错误,这不起作用。它与模板有关,但我不知道是什么。

你的B::method1声明中有很多语法错误,所以我猜你想让B::method1接受A<T>类型的参数。

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

template<typename T
class A
{
//implementation
friend class B;
};

classB.h

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

第一个文件中存在语法错误,尖括号未在模板参数后关闭。它应该template <typename T>在这一行中。

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

至少从我在示例代码中看到的内容来看,您只需从第一个文件中删除#include "classB.h"并简单地向classB添加一个前向声明即可解决此问题。因此,这些文件将如下所示:

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

链接器会将前向声明链接到正确的classB