1

以下のコードをコンパイルし、Microsoft Visual Studio 2008 のコンパイラで正常に実行しました。ただし、(プロジェクトの制約により) 実稼働環境で使用する必要があるコンパイラーは、Intel C++ コンパイラー 11.1.065 です。

それで、私の質問は次のとおりです。次のコードの構文の一部が間違っていますか (Visual Studio コンパイラはそれで動作します)、それとも私が使用しているインテル コンパイラのバージョンがサポートされていないだけですか? もしそうなら、Intel Compiler のバージョン 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;
}

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;
}
4

1 に答える 1

1

Bfromの前方宣言を削除し、A.hインクルードの順序を逆にします。

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

friend宣言されるまで、個々のメンバー関数を s にすることはできません。したがってB、 の ctor (したがって) は、 inBとして宣言する前に表示される必要があります。ただし、toのみを使用するため、 fwd の宣言だけで十分です。friendABAreferenceA

したがって、インクルードの順序を逆にする必要があります。

于 2013-05-21T18:34:22.017 に答える