我已经编译了下面的代码并使用 Microsoft Visual Studio 2008 的编译器成功运行它。但是,我需要在生产中使用的编译器(由于项目限制)是英特尔 C++ 编译器 11.1.065。
所以,我的问题是:以下代码中的某些语法是否不正确(Visual Studio 编译器只能使用它)还是我使用的英特尔编译器版本缺乏支持?如果是这样,是否有人愿意提供英特尔编译器版本 11.1.065 可以理解的语法?先感谢您!
头文件啊:
#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
头文件 Bh:
#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
具有主要功能的正文文件:
#include "B.h"
#include "A.h"
int main(int argc, char* argv[])
{
A<int> a;
B<int> b(a);
return 0;
}
英特尔编译器返回的错误是:
.\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;
}