我正在尝试专门化模板类成员函数:
在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]
有什么问题?
答案 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
- 结束示例]
不幸的是它是关于类模板的特化,而不是关于类模板的函数模板特化或函数成员特化。