[英]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.