模板类构造函数作为其他模板类的朋友
Template Class Constructor as Friend of Other Template Class
我已经编译了下面的代码,并在Microsoft Visual Studio 2008的编译器中成功运行了它。然而,我需要在生产中使用的编译器(由于项目限制)是Intel c++编译器11.1.065。
所以,我的问题是:以下代码中语法的某些部分是否不正确(和visual studio编译器只是与它一起工作),或者我使用的英特尔编译器的版本是否缺乏支持?如果是这样,有没有人愿意提供11.1.065版本的英特尔编译器可以理解的语法?提前感谢!
头文件A.h:
#ifndef A_H
#define A_H
#include "B.h"
//forward declarations
template <typename T> class B;
// I tried adding the following line (even though it is
// not needed by the visual studio compiler:
//template <typename T> B<T>::B(A<T> const&);
template <typename T>
class A
{
private:
int m_var;
public:
A() : m_var(1) {}
friend B<T>::B(A<T> const& x);
};
#endif //A_H
头文件B.h:
#ifndef B_H
#define B_H
#include "A.h"
template <typename T> class A;
template <typename T>
class B
{
private:
int m_var;
public:
B(A<T> const& x)
: m_var(x.m_var)
{}
};
#endif //B_H
带有Main函数的主体文件:
#include "B.h"
#include "A.h"
int main(int argc, char* argv[])
{
A<int> a;
B<int> b(a);
return 0;
}
Intel编译器返回的错误是:
.A.h(16): error: expected a ")"
friend B<T>::B(A<T> const& x);
^
编辑:由于这是否是由多次包含引起的关注太多,因此上面的代码扩展为以下代码,这表明多次包含不应该影响代码:
//<#include "B.h" expanded>
#ifndef B_H
#define B_H
//<#include "A.h" expanded>
#ifndef A_H
#define A_H
//<#include "B.h" expanded>
// Because B_H is defined, B.h's contents are not expanded
//</#include "B.h" expanded>
//forward declarations
template <typename T> class B;
// I tried adding the following line (even though it is
// not needed by the visual studio compiler:
//template <typename T> B<T>::B(A<T> const&);
template <typename T>
class A
{
private:
int m_var;
public:
A() : m_var(1) {}
friend B<T>::B(A<T> const& x);
};
#endif //A_H
//</#include "A.h" expanded>
template <typename T> class A;
template <typename T>
class B
{
private:
int m_var;
public:
B(A<T> const& x)
: m_var(x.m_var)
{}
};
#endif //B_H
//</#include "B.h" expanded>
//<#include "A.h" expanded>
// Because A_H is defined, A.h's contents are not expanded
//</#include "A.h" expanded>
int main(int argc, char* argv[])
{
A<int> a;
B<int> b(a);
return 0;
}
将B
的正向声明从A.h
中移除,并反转include的顺序。
#include "B.h"
#include "A.h".
你不能让单独的成员函数friend
s,直到它们被声明。因此,在将A
声明为friend
之前,B
的ctor(以及B
)需要是可见的。然而,B
可以只使用A
的fwd声明,因为它只使用reference
到A
。
因此您需要颠倒include的顺序。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 在其他文件中创建类时在 c++ 项目中不起作用
- 类与私有变量的其他类之间的线程安全性
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- GlobalAlloc而不是其他分配方法
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 结构和双指针隐藏在其他结构中,多层混淆
- UE4在OnComponentBeginOverlap上铸造其他actor
- 在这种情况下,我们可以使用静态而不是朋友吗,还有其他解决方案是什么
- 作为其他班级的朋友的私人功能
- 只能由其他类创建的类,而无需使用朋友
- 朋友拥有自己的类模板和其他模板参数
- 模板类构造函数作为其他模板类的朋友
- 在没有朋友c++的情况下访问其他类的私有数据