gpt4 book ai didi

c++ - 模板类成员函数的特化

转载 作者:行者123 更新时间:2023-11-28 05:29:00 25 4
gpt4 key购买 nike

有:

以下代码的结果是什么?

foo.h

#include <iostream>

template<class _Tp>
struct Foo
{
void print() { std::cout << "foo\n"; }
};

foo.cxx

#include "foo.h"

template<>
void Foo<int>::print()
{
std::cout << "foo<int>\n";
}

ma​​in.cxx

#include "foo.h"

int main()
{
Foo<double>().print();
Foo<int>().print();
return 0;
}

结果不同:

  1. 当被 MSVC 编译时,

    foo
    foo
  2. 用g++编译时,

    foo
    foo<int>

不管编译器如何,我都想得到第二个结果。我还应该做什么才能实现?如果可能的话,你能给我一个关于底层标准或机制的解释吗?谢谢你!

最佳答案

你的程序有未定义的行为。

Foo<int>::print()有两种实现方式-- 从类模板定义和 foo.cxx 中的非内联定义中获得的内联定义。编译器可以自由选择。

编译器不需要将其诊断为问题。他们中的许多人(显然包括 g++ 和 MSVC)选择这条路线来定义类模板及其成员函数。

为确保两个编译器都选择 foo.cxx 中的实现,请在 foo.h 中声明该函数。

#include <iostream>

template<class _Tp>
struct Foo
{
void print() { std::cout << "foo\n"; }
};

template<> void Foo<int>::print();

关于c++ - 模板类成员函数的特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39939722/

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