模板函数成员的模板特化与 class 模板相结合
Template specialization for template function members combined with class template
鉴于以下情况:
class MyClass
{
public:
template <typename T, typename U = T>
void doSomething(T) {}
private:
double parser;
};
template<>
inline void MyClass::doSomething<bool>(bool) {}
template<>
inline void MyClass::doSomething<int, double>(int) {}
int main(int argc, char* argv[])
{
MyClass foo;
foo.doSomething<bool>(true);
foo.doSomething<int, double>(10);
return 0;
}
这很好用。
但是现在我想引入一个 class 模板,以便使用模板参数而不是 ParserClass
,像这样:
template<typename P>
class MyClass
{
public:
template <typename T, typename U = T>
void doSomething(T) {}
private:
P parser;
};
template<>
inline void MyClass::doSomething<bool>(bool) {}
template<>
inline void MyClass::doSomething<int, double>(int) {}
int main(int argc, char* argv[])
{
MyClass<double> foo;
foo.doSomething<bool>(true);
foo.doSomething<int, double>(10);
return 0;
}
然而,这不再有效:
test.cpp:12:13: error: 'MyClass' is not a class, namespace, or enumeration
inline void MyClass::doSomething<bool>(bool) {}
^
test.cpp:2:7: note: 'MyClass' declared here
class MyClass
^
1 error generated.
这可能吗?上面例子中的成员函数模板参数和class模板参数如何组合?
要特化属于模板 class 成员的函数,您需要两个 template<>
声明。此外,您需要为 MyClass
:
指定 typename
template<> template<>
inline void MyClass<some_type>::doSomething<bool>(bool) { ... }
template<> template<>
inline void MyClass<some_type>::doSomething<int, double>(int) { ... }
鉴于以下情况:
class MyClass
{
public:
template <typename T, typename U = T>
void doSomething(T) {}
private:
double parser;
};
template<>
inline void MyClass::doSomething<bool>(bool) {}
template<>
inline void MyClass::doSomething<int, double>(int) {}
int main(int argc, char* argv[])
{
MyClass foo;
foo.doSomething<bool>(true);
foo.doSomething<int, double>(10);
return 0;
}
这很好用。
但是现在我想引入一个 class 模板,以便使用模板参数而不是 ParserClass
,像这样:
template<typename P>
class MyClass
{
public:
template <typename T, typename U = T>
void doSomething(T) {}
private:
P parser;
};
template<>
inline void MyClass::doSomething<bool>(bool) {}
template<>
inline void MyClass::doSomething<int, double>(int) {}
int main(int argc, char* argv[])
{
MyClass<double> foo;
foo.doSomething<bool>(true);
foo.doSomething<int, double>(10);
return 0;
}
然而,这不再有效:
test.cpp:12:13: error: 'MyClass' is not a class, namespace, or enumeration
inline void MyClass::doSomething<bool>(bool) {}
^
test.cpp:2:7: note: 'MyClass' declared here
class MyClass
^
1 error generated.
这可能吗?上面例子中的成员函数模板参数和class模板参数如何组合?
要特化属于模板 class 成员的函数,您需要两个 template<>
声明。此外,您需要为 MyClass
:
typename
template<> template<>
inline void MyClass<some_type>::doSomething<bool>(bool) { ... }
template<> template<>
inline void MyClass<some_type>::doSomething<int, double>(int) { ... }