1

我已经编译了下面的代码并使用 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;
}
4

1 回答 1

1

删除Bfrom的前向声明A.h并反转包含的顺序。

#include "B.h"
#include "A.h".

friend在声明它们之前,您不能创建单个成员函数。因此B的 ctor (因此B)需要在您将其声明为friendin之前可见A。但是,B只需一个 fwd 声明就可以通过,A因为它只使用 a referenceto A

因此,您需要颠倒包含的顺序。

于 2013-05-21T18:34:22.017 回答