以下のコードをコンパイルし、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;
}