gpt4 book ai didi

c++ header 多次使用

转载 作者:太空宇宙 更新时间:2023-11-04 11:49:18 25 4
gpt4 key购买 nike

我有一个模板类 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
  • lib2
    • main2.cpp
    • T2.hpp
    • lib2.so
  • 库N
    • 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

使用内置规范。收集_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.7 --with-gxx-include-dir=/opt/local/include/gcc47/c++/--with-gmp=/opt/local --with-mpfr=/opt/local --with-mpc=/opt/local --with-ppl=/opt/local --with-cloog=/opt/local --enable-cloog-backend=isl --disable-cloog-version-check -- enable-stage1-checking --enable-lto --enable-libstdcxx-time --with-as=/opt/local/bin/as --with-ld=/opt/local/bin/ld --with-ar =/opt/local/bin/ar --with-bugurl= https://trac.macports.org/newticket --disable-ppl-version-check --with-pkgversion='MacPorts gcc47 4.7.2_2+universal'线程模型:posixgcc 版本 4.7.2 (MacPorts gcc47 4.7.2_2+universal)

但是它在 linux 上可以正常工作。

g++ -v

使用内置规范。收集_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线程模型:posixgcc 版本 4.7.0 (GCC)

更新 3:

我的解释具有误导性,因为我实际上是在创建具有相同名称的文件(lib1/T.hpp、lib2/T.hpp、..)。类型 T_i 的名称也相同。通过包含相应目录中的 T.hpp 来选择正确的。为 T_i(不是 T_i.hpp)使用不同的名称解决了这个问题。但是,我仍然想知道当类型名称相同时出了什么问题。

最佳答案

我试过你的代码,效果很好。 A<T2> a; a.foo()将输出 2。

由于 T.hpp 和 main.cpp 具有相同的名称,我担心错误的代码链接。

您可能想使用不同的文件名。 :)

关于c++ header 多次使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18995061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com