这是我要解决的问题。我有以下头文件:
class Foo
{
public:
Foo() {}
~Foo() {}
template<typename T>
T bar()
{
T var1 {65};
T var2 {66};
return var1 + var2;
}
};
如果我运行以下 main.cpp
printf("%d\n", f.bar<int>());
printf("%f\n", f.bar<float>());
printf("%s\n", f.bar<std::string>().c_str());
我得到了这个结果,正如预期的那样:
131
131.000000
AB
假设我想用 std::string 专门化这个案例。我首先尝试这样做:
class Foo
{
public:
Foo() {}
~Foo() {}
template<typename T>
T bar()
{
T var1 {65};
T var2 {66};
return var1 + var2;
}
template<>
std::string bar()
{
return "Hello";
}
};
但是编译器不高兴并说“错误:在非命名空间范围‘class Foo’中显式特化”。好的好的,我把它从头文件中删除并放在一个cpp文件中,就像这样:
template<>
std::string Foo::bar()
{
return "Hello";
}
这一次编译器很高兴,但是当我运行程序时,我得到了相同的输出,并且没有选择 std::string 专业化。我希望主要返回这个:
131
131.000000
Hello
有人知道这里发生了什么吗?特别是,为什么我不能在头文件中声明特化?为什么 cpp 文件中的专业化不起作用?我错过了什么?
我正在使用 gcc 版本 8.5.0
谢谢