我有一个A
带有类型参数的模板类T
。我的程序为类型参数生成了几个版本 - T_1
, .. , T_N
. 此外,对于每种类型T_i
,代码A<T_i>
都被编译到库lib_i
中。最后,对于每个lib_i
,我从 调用一个函数A<T_i>
。但是,我总是得到对应于T_1
. 可能是什么问题呢?
这里有更多细节。
文件结构:
- A.hpp
- 库1
- main1.cpp
- T1.hpp
- lib1.so
- 库2
- main2.cpp
- T2.hpp
- lib2.so
- 库N
- 主N.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 version 4.7.0 (GCC)
更新3:
我的解释具有误导性,因为我实际上是在创建具有相同名称的文件(lib1/T.hpp、lib2/T.hpp、..)。T_i 类型的名称也相同。通过包含相应目录中的 T.hpp 选择了正确的一个。为 T_i 使用不同的名称(而不是 T_i.hpp)解决了这个问题。但是,我仍然想知道当类型名相同时出了什么问题。