以下代码:
template <typename S, typename T>
struct foo {
void bar();
};
template <typename T>
void foo <int, T>::bar() {
}
Run Code Online (Sandbox Code Playgroud)
给了我错误
invalid use of incomplete type 'struct foo<int, T>'
declaration of 'struct foo<int, T>'
Run Code Online (Sandbox Code Playgroud)
(我正在使用gcc.)我的部分特化的语法错了吗?请注意,如果我删除第二个参数:
template <typename S>
struct foo {
void bar();
};
template <>
void foo <int>::bar() {
}
Run Code Online (Sandbox Code Playgroud)
然后它正确编译.
我遇到了一个有趣的观点,我无法解释或找到解释.考虑以下模板定义(使用mingw g ++ 4.6.2编译):
template <typename T, typename S>
class Foo
{
public:
void f(){}
void g(){}
};
Run Code Online (Sandbox Code Playgroud)
如果我们想要,我们可以完全专注于任何单一成员函数:
template <>
void Foo<char,int>::f() {}
Run Code Online (Sandbox Code Playgroud)
但部分特化失败,"无效使用不完整类型'类Foo <...>'"错误:
template <typename T, typename S>
void Foo<T,S*>::f()
{
}
template <typename T>
void Foo<T,int>::f()
{
}
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚原因.这是一个有意识的设计决策,以避免一些我无法预见的问题?这是疏忽吗?
提前致谢.
在阅读了诸如sfinae on member function Defined Outside of Class Body(这不是同一个问题)等问题之后,我仍然没有找到在使用时在类声明之外定义成员函数主体的好方法SFINAE 方法仅启用具有算术类型的类。
#include <type_traits>
template <typename T,typename = typename std::enable_if<std::is_arithmetic<T>::value,T>::type>
class foo
{
public:
void bar();
};
template <typename T>
void foo<T>::bar ()
{
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,我收到错误:
error: invalid use of incomplete type 'class foo<T>'
void foo<T>::bar ()
^
error: declaration of 'class foo<T>'
class foo
^
Run Code Online (Sandbox Code Playgroud)
而如果我这样声明:
#include <type_traits>
template <typename T,typename = typename std::enable_if<std::is_arithmetic<T>::value,T>::type>
class foo
{
public:
void bar()
{
}
};
Run Code Online (Sandbox Code Playgroud)
它运行起来没有任何问题。
我正在使用 mingw-w64 (w64 3.3) 来编译此代码。