有:
以下代码的结果是什么?
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;
}
结果不同:
当由MSVC编写时,
foo
foo
由g ++编译时,
foo
foo<int>
无论编译器如何,我都希望得到第二个结果。我还应该做些什么呢?如果可能的话,您能否就基础标准或机制给我一个解释。谢谢!
答案 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();