繁体   English   中英

如何专门化这个模板成员函数?

[英]How do I specialize this template member function?

我有这个设置:

class DontUse;

template<class T,class U = DontUse, class V = SomeStandardType>
class Foo
{
   public:
     void bar(U &uh);
};

当U设置为DontUse时,我希望bar为空函数。 在所有其他情况下,我希望bar有一些实现。 我尝试使用专门化,但这个代码(我意识到在某种程度上是不正确的)不编译:

template<class T,class V> void Foo<T,DontUse,V>::bar(DontUse &none){}
template<class T,class U,class V> void Foo<T,U,V>::bar(U &uh)
{
  //do something here
}

错误消息是这个(MSVC10):

1>path_to_project: error C2244: 'Foo<T,U,V>::bar' : unable to match function definition to an existing declaration

它指向第一个模板专业化的行。

我该怎么做呢?

这是实际的代码,虽然它已经简化为相关的极简主义部分:

    struct DontUse;

    template<typename Derived, typename Renderer =  DontUse, typename TimeType = long>
    class Gamestate
    {
    public:

        void Render(Renderer &r);

    };

    template<typename Derived, typename TimeType> void Gamestate<Derived, DontUse,TimeType>::Render( DontUse){}
    template<typename Derived, typename Renderer, typename TimeType> void Gamestate<Derived,Renderer,TimeType>::Render(Renderer &r)
    {
        static_cast<Derived*>(this)->Render(r);
    }

您无法专门化模板的各个成员。 你必须专门化这个类本身:

class DontUse;

template<class T, class V>
class Foo<T, DontUse, V>
{
   public:
     void bar(DontUse)
     { }
};

我建议只使用这个:

#include <type_traits>

template <class A, class B, class C>
struct S
{
    void foo(B& b)
    {
        static_assert(!std::is_same<U, DontUse>::value, "Bad Boy!");
    }
};

或者,如果你真的想要一个空函数,只需使用if。

#include <type_traits>

template <class A, class B, class C>
struct S
{
    void foo(B& b)
    {
         if(!std::is_same<U, DontUse>::value)
         {
              //all code goes here
         }
    }
};

它不像那样工作。 类模板的成员函数本身不是一个单独的模板,并且不能独立于类模板进行专门(部分或完全)。

您需要定义类模板Foo ,给它一个bar成员函数,并定义它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM