私のコンパイラは次のエラーを発行しました:
matrix.o: In function `Matrix::modify_cell(unsigned int, unsigned int, int)':
Matrix.cpp:(.text+0x5f): undefined reference to `operator!(Dim)'
Matrix.cpp:(.text+0xa3): undefined reference to `operator!(Dim)'
Matrix.cpp:(.text+0x178): undefined reference to `operator!(Dim)'
Matrix.cpp:(.text+0x1a0): undefined reference to `operator!(Dim)'
matrix.o: In function `List::nula(Dim) const':
Matrix.cpp:(.text._ZNK4List4nulaE3Dim[List::nula(Dim) const]+0x11): undefined reference to `operator!(Dim)'
list1.o:List - auxiliary methods.cpp:(.text+0x3b): more undefined references to `operator!(Dim)' follow
collect2: ld returned 1 exit status
make: *** [app] Error 1
Matrixは、ファイルMatrix.hおよびMatrix.cppに配置されるクラスであり、クラスListから継承し、次にList.hおよび他の2つの.cppファイルに配置されます。タイプDim(typedef)と演算子!それは、List.hと演算子に含まれるaux.hでグローバルに(クラスの外で)宣言されているからです!aux.cppで定義されています。Matrix.hにList.hを含めているので、何が問題なのかわかりません。aux.cppは、実際にmakefileで.oにコンパイルされてから、単一のアプリに結合されます。
typedef Dimとそのオーバーロードされた演算子をクラスに配置する方がよいことはわかっていますが、typedefが継承されていない間は、クラスListとクラスMatrixの両方で使用され、他の回避策はわかりません。
編集:
// aux.cpp
#include "aux.h"
Dim operator!(Dim dim) { return dim == COL ? ROW : COL; }
// aux.h
#ifndef AUX_H
#define AUX_H
/* (...) */
typedef enum { ROW, COL } Dim;
inline Dim operator!(Dim dim);
#endif