簡體   English   中英

C++ 預期的嵌套名稱說明符

[英]C++ expected nested-name-specifier

expected nested-name-specifier before 'ClassB'但我不知道為什么。 這是 class A:

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

現在這里是 class B,它使用了 class 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) {}
}

第一個文件中存在語法錯誤,在模板 arguments 之后沒有關閉 angular 括號。 它應該是該行中的template <typename T>

除此之外,您不能相互包含這樣的頭文件。 想想編譯器在這里必須做什么——它讀取第一個 header 文件,然后嘗試從第二個 header 文件中讀取所有源代碼(因為它包含在內),然后它嘗試再次從第一個 Z0397439FB995EZ0603F 讀取所有源代碼文件(因為它包含在第二個文件中)....

至少從我在示例代碼中看到的內容來看,您可以通過從第一個文件中刪除#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) {}
}

linker 會將前向聲明鏈接到正確的classB

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM