c++ - 我如何专门化这个模板成员函数?

标签 c++ templates template-specialization

我有这个设置:

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)本身:

class DontUse;

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

关于c++ - 我如何专门化这个模板成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9502197/

相关文章:

c++ - C++ 中的单向链表

c++ - 在 C++ 表达式模板编程中是否可以实现高效的 "repeatedly used intermediates"?

azure - 如何在 Azure 中使用 ARM 模板打印链接模板的输出

jquery - 如何将jquery Mustache应用到外部文件/模板

c++ - 为什么需要内联模板特化?

C++类模板特化问题

c++ - 简化复杂的 C++ 模板符号

c++ - 数组错误(不允许使用不完整的类型)

c++ - 使用从模板化基类继承的成员变量 (C++)

c++ - 基于类成员的存在/不存在来专门化 C++ 模板?