Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从类模板的(部分)专用化调用其静态函数_C++_Templates - Fatal编程技术网

C++ 从类模板的(部分)专用化调用其静态函数

C++ 从类模板的(部分)专用化调用其静态函数,c++,templates,C++,Templates,有没有办法让这段代码按预期工作 #include <iostream> using namespace std; template<typename T> class templated{ public: static void f(){ cout<<"doing something generically"<<endl; } }; template<> class templated<int&

有没有办法让这段代码按预期工作

#include <iostream>
using namespace std;

template<typename T> class templated{
public:
    static void f(){
        cout<<"doing something generically"<<endl;
    }
};

template<> class templated<int>{
public:
    static void g(){
        cout<<"doing something else, but specific to int"<<endl;
        f();
    }
};

int main(){
    templated<int>::g();
}
#包括
使用名称空间std;
模板类模板化{
公众:
静态空隙f(){

cout您的专用版本根本没有
f()
(这里没有“继承”)


如果您想要继承,您可能应该考虑将<代码> f>(或代码>)转换为基类。

< P>您的专业版本根本没有<代码>()>代码>(这里没有“继承”)。

如果你想继承,你可能应该考虑将< <代码>()>代码>转换成基类。

< P>不,一个专门化完全与基础模板分离,并且不从它继承任何东西。
也许您可以添加一个可以从任何地方调用的免费函数?

不,专门化完全独立于基本模板,并且不会“继承”它的任何内容


也许您可以添加一个可以从任何地方调用的自由函数?

在这种特殊情况下,您可以继承,因为您没有使用模板参数类型:

template<> class templated<int>: templated<void>{
public:
    static void g(){
        cout<<"doing something else, but specific to int"<<endl;
        f();
    }
};
模板类模板化:模板化{
公众:
静态空隙g(){

cout在这种特殊情况下,您可以继承,因为您没有使用模板参数类型:

template<> class templated<int>: templated<void>{
public:
    static void g(){
        cout<<"doing something else, but specific to int"<<endl;
        f();
    }
};
模板类模板化:模板化{
公众:
静态空隙g(){

cout您可以使用某种包装,例如:

    template<typename T>
    class templated_core
    {
      public:
        static void f()
        {
          cout<<"doing something generically"<<endl;
        }
    };

    template<typename T>
    class templated : public templated_core<T>
    {
    };

    template<>
    class templated<int> : public templated_core<int>
    {
      public:
        static void g()
        {
          cout<<"doing something else, but specific to int"<<endl;
          f();
        }
    };
模板
类模板化的_核
{
公众:
静态空隙f()
{

cout您可以使用某种包装,例如:

    template<typename T>
    class templated_core
    {
      public:
        static void f()
        {
          cout<<"doing something generically"<<endl;
        }
    };

    template<typename T>
    class templated : public templated_core<T>
    {
    };

    template<>
    class templated<int> : public templated_core<int>
    {
      public:
        static void g()
        {
          cout<<"doing something else, but specific to int"<<endl;
          f();
        }
    };
模板
类模板化的_核
{
公众:
静态空隙f()
{

你有没有试过
templated::f()
?我真的不明白。主类template
template class templated
不是一个可以调用其静态成员的类型。这样做的目的是什么?@ypnos当然有。但是答案似乎明确地表明我不能做我想做的事情。你有没有试过
templated::f()
?我真的不明白。主类template
模板类templated
不是一种可以调用其静态成员的类型。这样做的目的是什么?@ypnos我当然知道。但答案似乎明确地表明我不能做我想做的事情。哇,这太令人困惑了。我应该如何阅读它?继承f的模板专门化rom的泛型形式,或者只是一个名为“templated”的伪模板列表类,它继承自templated的伪版本?这种方法有任何警告吗?@Lorenzo-
templated
使用基本模板,因此它是允许的。但是,如果是,模板也非常无用(不能有类型为t=void的成员,那么它的用途是什么?)。这在某些情况下可以工作,但在许多实际场景中,
f()
可能取决于模板类型,这并不是一个真正的选项。解决方案很有趣,但我确实需要某种“继承”在通用模板和专用模板之间。如果不能实现,我将以某种方式加入经典继承。你得到了投票,但Bo Persson得到了接受的答案:)哇,这太让人吃惊了。我该怎么读呢?继承自其泛型形式的模板专门化,或者只是一个名为“templated”的伪模板列表类,继承自templated的伪版本?这种方法有任何警告吗?@Lorenzo-
templated
使用基本模板,因此它是允许的。但是,如果是的,模板也非常无用(不能有类型为t=void的成员,那么它的用途是什么?)。这在某些情况下可以工作,但在许多实际场景中,
f()
可能取决于模板类型,这并不是一个真正的选项。解决方案很有趣,但我确实需要一种“继承”在泛型和专用模板之间。如果不能实现,我将以某种方式加入经典继承。你得到了投票,但Bo Persson得到了接受的答案:)是的,我正在考虑自由函数和继承。我想知道为什么泛型和专用类模板是完全分开的:这样你就必须重新定义cla即使你只需要修改行为的一小部分,ss也会起作用。它们是分开的,因为你要单独声明它们。如果你想要一些共同的功能,你可以把它们放在一个共同的基类中——就像我们一直做的那样。是的,我同时考虑自由函数和继承。我想知道为什么通用和专用类模板re完全独立:通过这种方式,即使只需修改行为的一小部分,也必须重新定义类的功能。它们是独立的,因为它们是单独声明的。如果您想要一些公共功能,可以将其放在公共基类中,就像我们一直做的那样。