模板类成员函数的模板特化

时间:2014-05-18 10:29:17

标签: c++ templates template-specialization

我正在尝试专门化模板类成员函数:

在valueinput.h

namespace Gui
    {
    template<class T>
    class ValueInput:public TextInput
        {
        public:         
            static ValueInput* create(Gui& gui_obj,uint32_t style_0,uint32_t style_1
                ,Window* parent,T& obj)
                {return new ValueInput(gui_obj,style_0,style_1,parent,obj);}

            //Polymorphic implementation inherited from
            //TextInput that needs specialization depending on T
            void valueUpdate();

            //Polymorphic implementation inherited from
            //TextInput that needs specialization depending on T
            void displayUpdate();

        protected:
            ValueInput(Gui& gui_obj,uint32_t style_0,uint32_t style_1,Window* parent
                ,T& obj):TextInput(gui_obj,style_0,style_1,parent),ptr_obj(&obj)
                {}

        private:
            T* ptr_obj;
        };
    }

在valueinput.cpp

template<>
void Gui::ValueInput<double>::displayUpdate()   
    {
    Dialog::messageDisplay(this,{STR("Display Update"),Herbs::LogMessage::Type::INFORMATION},STR("Test"));
    }

template<>
void Gui::ValueInput<double>::valueUpdate() 
    {
    Dialog::messageDisplay(this,{STR("Value Update"),Herbs::LogMessage::Type::INFORMATION},STR("Test"));
    }

编译器输出:

g++ "valueinput.cpp" -g -municode -Wall -c -std=c++11 -o "__wand_targets_dbg\valueinput.o"
  

valueinput.cpp:21:45:错误:&#39; void Gui :: ValueInput :: displayUpdate()[with T = double]&#39;在不同的命名空间[-fpermissive]

     

valueinput.cpp:21:6:错误:来自&#39; void Gui :: ValueInput :: displayUpdate()[with T = double]&#39;的定义[-fpermissive]

     

valueinput.cpp:27:43:错误:&#39; void Gui :: ValueInput :: valueUpdate()[with T = double]&#39;在不同的命名空间[-fpermissive]

     

valueinput.cpp:27:6:错误:来自&#39; void Gui :: ValueInput :: valueUpdate()[with T = double]&#39;的定义[-fpermissive]

有什么问题?

1 个答案:

答案 0 :(得分:1)

以下列方式重写valueinput.cpp文件中的代码:

namespace Gui
{
    template<>
    void ValueInput<double>::displayUpdate()   
    {
        Dialog::messageDisplay(this,{STR("Display Update"),Herbs::LogMessage::Type::INFORMATION},STR("Test"));
    }

    template<>
    void ValueInput<double>::valueUpdate() 
    {
        Dialog::messageDisplay(this,{STR("Value Update"),Herbs::LogMessage::Type::INFORMATION},STR("Test"));
    }
}

如果您想在valueinput.h文件之外使用它们,请不要忘记在valueinput.cpp头文件中声明这些特化:

namespace Gui
{
    template<class T>
    class ValueInput : public TextInput
    {
        // ...
    };

    template<>
    void ValueInput<double>::displayUpdate();

    template<>
    void ValueInput<double>::valueUpdate();

}

编辑:我不知道您的变体是否符合标准。但这里有一个标准的小引号([temp.expl.spec] 14.7.3 / 8):

  

模板显式特化是在命名空间的范围内   其中定义了模板。    [例如:

namespace N {
  template<class T> class X { /* ... */ };
  template<class T> class Y { /* ... */ };

  template<> class X<int> { /* ... */ };      // OK: specialization
                                              // in same namespace
  template<> class Y<double>;                 // forward declare intent to
                                              // specialize for double
}

template<> class N::Y<double> { /* ... */ };  // OK: specialization
                                              // in same namespace
     

- 结束示例]

不幸的是它是关于类模板的特化,而不是关于类模板的函数模板特化或函数成员特化。