模板类成员函数的特化

时间:2016-10-09 03:29:34

标签: c++ template-specialization

有:

以下代码的结果是什么?

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";
}

main.cxx

#include "foo.h"

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

结果不同:

  1. 当由MSVC编写时,

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

    foo
    foo<int>
    
  3. 无论编译器如何,我都希望得到第二个结果。我还应该做些什么呢?如果可能的话,您能否就基础标准或机制给我一个解释。谢谢!

3 个答案:

答案 0 :(得分:1)

您的程序有不确定的行为。

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();

答案 1 :(得分:0)

很感兴趣。我知道模板是在编译时解释的,而不是链接时。所以,在我看来,专业化模板应该在每个cpp文件中实现。你的g ++版本是什么?

答案 2 :(得分:0)

如果 foo.h 如下所示,则两个编译器都会产生相同的结果。但我不知道为什么。

#include <iostream>


template<class _Tp>
struct Foo
{
   void print();
};

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

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