1

A型引数を持つテンプレート クラスがありますT。私のプログラムは、型引数 - T_1, .. ,のいくつかのバージョンを生成しますT_N。さらに、タイプごとに、 をT_i使用したコードがA<T_i>ライブラリにコンパイルされますlib_i。最後に、 ごとlib_iに、 から関数を呼び出しますA<T_i>。ただし、常にに対応する結果が得られT_1ます。何が問題なのですか?

ここに詳細があります。

ファイル構造:

  • A.hpp
  • lib1
    • main1.cpp
    • T1.hpp
    • lib1.so
  • lib2
    • main2.cpp
    • T2.hpp
    • lib2.so
  • libN
    • mainN.cpp
    • TN.hpp
    • libN.so

例:

A.hpp:

template <class T>
class A
{
    void foo()
    {
        std::cout << T::K << std::endl;
    }
};

T1.hpp:

class T1
{
    enum { K = 1 };
};

T2.hpp:

class T2
{
    enum { K = 2 };
};

main1.cpp と main2.cpp の両方が A::foo() を呼び出します。しかし、出力は常に 1 です。

アップデート

main1.cpp:

#include "../A.hpp"
#include "T1.hpp"

int main(int argc, char **argv)
{
    A<T1> a;
    a.foo();
    return 0;
}

main2.cpp:

#include "../A.hpp"
#include "T2.hpp"

int main(int argc, char **argv)
{
    A<T2> a;
    a.foo();
    return 0;
}

更新 2:

これは mac os x で発生します。

g++ -v

組み込みの仕様を使用します。COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=/opt/local/libexec/gcc/x86_64-apple-darwin11/4.7.2/lto-wrapper ターゲット: x86_64-apple-darwin11 構成: ../gcc-4.7.2/configure --prefix =/opt/local --build=x86_64-apple-darwin11 --enable-languages=c,c++,objc,obj-c++,lto,fortran,java --libdir=/opt/local/lib/gcc47 --includedir =/opt/local/include/gcc47 --infodir=/opt/local/share/info --mandir=/opt/local/share/man --datarootdir=/opt/local/share/gcc-4.7 --with -libiconv-prefix=/opt/local --with-local-prefix=/opt/local --with-system-zlib --disable-nls --program-suffix=-mp-4.https://trac.macports.org/newticket --disable-ppl-version-check --with-pkgversion='MacPorts gcc47 4.7.2_2+universal' スレッド モデル: posix gcc バージョン 4.7.2 (MacPorts gcc47 4.7.2_2 +ユニバーサル)

ただし、Linux では正しく動作します。

g++ -v

組み込みの仕様を使用します。COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=/usr/gcc_4_7/libexec/gcc/x86_64-linux-gnu/4.7.0/lto-wrapper ターゲット: x86_64-linux-gnu 構成: ../gcc-4.7.0/configure --build =x86_64-linux-gnu --prefix=/usr/gcc_4_7 --with-gmp=/usr/gcc_4_7 --with-mpfr=/usr/gcc_4_7 --with-mpc=/usr/gcc_4_7 --enable-checking= release --enable-languages=c,c++,fortran --disable-multilib --program-suffix=-4.7 スレッド モデル: posix gcc バージョン 4.7.0 (GCC)

更新3:

実際には同じ名前のファイル (lib1/T.hpp、lib2/T.hpp、..) を作成していたため、私の説明は誤解を招くものでした。型 T_i の名前も同じでした。対応するディレクトリから T.hpp を含めることにより、正しいものが選択されました。T_i (T_i.hpp ではなく) に別の名前を使用すると、問題が解決しました。しかし、型名が同じだったのに何が悪かったのか、私はまだ疑問に思っています。

4

1 に答える 1