c++ - 单独对象的单一模板实例化

标签 c++ templates

考虑以下几点:

/* T.h */
template <class T>
void Too() {
    std::cout << "  Template: " << typeid(T).name()
              << " size: " << sizeof(T) << std::endl;
}
/* A.h */
extern void FooA();
/* A.cpp */
struct Local {
    int a[2];
}

void FooA() {
    Local l;
    std::cout << "<Foo A>:\n" << "  Real: " << typeid(l).name()
              << " size: " << sizeof(l) << std::endl;
    Too<Local>();
}
/* B.h */
extern void FooB();
/* B.cpp */
struct Local {
    int a[4];
};

void FooB() {
    Local l;
    std::cout << "<Foo B>:\n" << "  Real: " << typeid(l).name() \
              << " size: " << sizeof(l) << std::endl;
    Too<Local>();
}
/* main.cpp */
int main() {
    FooA();
    FooB();
    return 0;
}

编译运行结果在:

<Foo A>:
  Real: 5Local size: 8
  Template: 5Local size: 8
<Foo B>:
  Real: 5Local size: 16
  Template: 5Local size: 8

这意味着单个模板实例化用于两个模板调用。值得注意的是 - 第一个。 虽然可以通过将 Too() 定义为

来解决此“功能”
template <class T, size_t s = sizeof(T)> Too();

我想知道是否有更通用的方法来解决这个问题?因为如果两个调用结构的大小相同,上面的代码仍然会失败。

编辑:

具体来说,我的问题在于,我无法更改文件 A 和 B。因此我可能不会为它们引入匿名 namespace 。 有没有模板方面的解决方案?因此第二个模板参数。

最佳答案

您的程序因包含 struct Local 的两个定义而违反了 ODR(单一定义规则)。这意味着它的格式不正确并且具有未定义的行为,因此任何事情都有可能发生。

关于c++ - 单独对象的单一模板实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16543638/

相关文章:

c++ - 在 Windows 上运行的 GCC 代码编译器错误

c++ - 找不到 BOOST_FILESYSTEM(缺少 : BOOST_FILESYSTEM_LIBRARIES)

c++ - 无法推断模板参数 - 泛型函数

c++ - 模板函数的默认类型假设

c++ - 递归的想法

c++ - 在类中获取 "this"的上下文并分配给类指针 TheClass*

Python C++ float 学表示错误

c++ - 有没有一种通用的方法可以用 SFINAE 否定 decltype 条件?

c++ - 成员函数和const成员函数指针推导

c++ - 一个参数中有 2 个常量