显式模板专门化不能有存储类 - 成员方法专门化

时间:2015-03-13 20:55:50

标签: c++

说我在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");
}

3 个答案:

答案 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>()