我遇到类似的情况:
template<class A, class B>
class MyClass<A, B>
{
...
static A RARELY_USED_A;
}
// Seems to work but does not cover all possible cases, since
// there may be instances of A that have no numeric limits.
template<class A, class B>
A MyClass<A, B>::RARELY_USED_A= std::numeric_limits<A>::max();
从我看来,这似乎有效。但是,在某些情况下,字符串可能会被用作A,因此我认为我只是为这种特殊情况创建了一个专门化。
// Does not complile
template<class B>
string MyClass<string, B>::RARELY_USED_A= "";
不幸的是,这与错误消息无法正确匹配:
error: template definition of non-template 'std::string MyClass<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, B>::RARELY_USED_A'
请注意,在另一方面,完全专业化似乎有效(在运行时未经测试但编译)
// This complies but is not gernic enough and hence useless to me
template<>
string MyClass<string, string>::RARELY_USED_A= "";
我认为,我一定是做错了。如果你能指出究竟是什么,我将非常感激。我认为专业化的专业化应该以这种方式运作。
提前多多感谢。
e:将DEFAULT_A的名称编辑为RARELY_USED_A,因为我认为“默认”会误导某种方式
答案 0 :(得分:4)
使用继承来重用和专门化而不复制所有公共代码:
template<typename A>
struct RarelyUsedShared
{
static A RARELY_USED_A;
};
template<typename A>
A RarelyUsedShared<A>::RARELY_USED_A = std::numeric_limits<A>::max();
template<>
string RarelyUsedShared<string>::RARELY_USED_A = "";
template<typename A, typename B>
class MyClass<A, B> : RarelyUsedShared<A>
{
...
};
请注意,这将导致在各种B
之间共享成员,如果该成员应为const
,则可以。如果没有,帮助程序可以采用两个模板参数,您可以对其进行部分专门化:
template<typename A, typename B>
struct RarelyUsedNotShared
{
static A RARELY_USED_A;
};
template<typename A, typename B>
A RarelyUsedNotShared<A, B>::RARELY_USED_A = std::numeric_limits<A>::max();
template<typename B>
struct RarelyUsedNotShared<string, B>
{
static A RARELY_USED_A;
};
typename<typename B>
string RarelyUsedNotShared<string, B>::RARELY_USED_A = "";
template<typename A, typename B>
class MyClass<A, B> : RarelyUsedNotShared<A, B>
{
...
};
答案 1 :(得分:1)
您需要为整个班级提供部分专业化,而不仅仅是单个成员。
答案 2 :(得分:0)
如果你的RARELY_USED
是const,你可以使用一个小帮助类:
template <class A, class B>
const A MyClass<A, B>::RARELY_USED_A = Helper<A>::value;
/*...*/
#include <limits>
#include <string>
template <typename A> struct Helper { static const A RARELY_USED_A; };
template <typename A> const A Helper<A>::RARELY_USED_A = std::numeric_limits<A>::max();
template <> struct Helper<std::string> { static const std::string RARELY_USED_A; };
const std::string Helper<std::string>::RARELY_USED_A = "";