说我在Visual Studio中有以下代码
class foo
{
public:
template<typename t>
void foo_temp(int a , t s_)
{
std::cout << "This is general tmeplate method";
}
template<>
static void foo_temp(int a , int s)
{
std::cout << "This is a specialized method";
}
};
int main()
{
foo f;
f.foo_temp<std::string>(12,"string");
}
现在我试图将其转换为GCC。通过关于SO的其他问题我注意到,如果该类不是专门的,那么在GCC中,成员方法不能被专门化。因此,我提出了这个解决方案
class foo
{
public:
template<typename t>
void foo_temp(int a , t s_)
{
std::cout << "This is general template method";
}
};
template <>
/*static*/ void foo::foo_temp<int>(int a, int value) {
std::cout << "Hello world";
}
现在这似乎可以解决这个问题,但是当我在语句中包含static关键字时会出现错误
explicit template specialization cannot have a storage class
现在this线程讨论了它,但我仍然对如何在这里应用它感到困惑。关于如何使最后一个方法静态的任何建议?另外,我仍然感到困惑的是为什么模板化的方法在GCC中不能是静态的?
这是视觉工作室代码
class foo
{
public:
template<typename t>
void foo_temp(int a , t s_)
{
std::cout << "This is general tmeplate method";
}
template<>
static void foo_temp(int a , int s)
{
std::cout << "This is a specialized method";
}
};
int main()
{
foo f;
f.foo_temp<std::string>(12,"string");
}
答案 0 :(得分:3)
关于如何将最后一个方法设为静态的任何建议?
你不能;它没有语言支持。
另外,我仍然感到困惑的是为什么模板化的方法在GCC中不能是静态的?
他们可以,他们不能同时是静态的和非静态的。例如:
struct foo {
template<typename T>
void bar() {}
template<typename T>
static void baz() {}
};
int main() {
foo f;
f.template bar<void>();
foo::baz<void>();
}
为什么你必须对模板函数进行静态特化,这让我很困惑。我会认真地重新评估这段代码以获得理智。
答案 1 :(得分:2)
你有没有尝试过老式的超载?不要将静态方法作为模板,让重载优先级来处理它。
答案 2 :(得分:1)
静态方法不是问题,类中的template<>
声明是主要元凶。您无法在类中声明专用模板。你可以改用命名空间:
namespace foo{
template<typename t>
void foo_temp(int a , t s_)
{
std::cout << "This is general tmeplate method";
}
template<>
void foo_temp(int a , int s)
{
std::cout << "This is a specialized method";
}
}
int main()
{
foo::foo_temp<int>(12,7);
}
或者您可以在类中使用它:
class foo
{
public:
template<typename t>
void foo_temp(int a , t s_)
{
std::cout << "This is general tmeplate method";
}
static void foo_temp(int a , int s)
{
std::cout << "This is a specialized method";
}
};
int main()
{
foo f;
f.foo_temp(12,"string");
f.foo_temp(12,6);
}
N.B:在这种情况下,您应该同时调用这两个函数(至少是第二个函数),而不是f.foo_temp(a,b)
而不是f.foo_temp<int>()
。