2017-02-22 55 views
0

我有一个静态常量变量的类,需要根据模板参数中的变量类型进行不同的初始化。有没有办法做到这一点没有专业化?在C++中初始化一个依赖于模板参数中的类型的变量

在我的头文件我有:

template<class Item> 
class CircularQueue { 
public: 
    static const Item EMPTY_QUEUE; 
    ... 

试图在.cpp文件中对其进行初始化:

template<typename Item> const Item CircularQueue<Item>::EMPTY_QUEUE = Item("-999"); 

我想它初始化为-999不管它是一个int,双或字符串,但是在上面的代码中,我得到一个“从'const char'转换为'int'丢失精度[-fpermissive]”错误。

+0

也许创建可以代替专门的模板初始化帮手。 'template class Initializer {...};' –

+0

不,你需要专业化。您不需要专门研究整个'CircularQueue'模板类,但是您可以使用单独的专用辅助类来初始化'EMPTY_QUEUE'。 –

回答

1

提供了一个使用可以专用的单独帮助器类的示例,而不必专门研究整个模板类,因为您提到过您希望看到此方法的示例。

只需声明一个单独的模板类来设置默认值,并将其专用于std::string

template<class Item> class defaultItem { 

public: 

    static constexpr Item default_value() { return -999; } 
}; 

template<> class defaultItem<std::string> { 

public: 
    static constexpr const char *default_value() { return "-999"; } 
}; 

您不必使用constexpr关键字,如果你的C++编译器是最近的年份不是。如果需要,您也可以为const char *定义相同的专业化,而不是std::string

然后,你的主类简单的定义为EMPTY_QUEUE

template<typename Item> 
const Item CircularQueue<Item>::EMPTY_QUEUE = 
      defaultItem<Item>::default_value();