相关疑难解决方法(0)

部分模板特化的"无效使用不完整类型"错误

以下代码:

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)

然后它正确编译.

c++ gcc templates partial-specialization

31
推荐指数
3
解决办法
2万
查看次数

模板类不完全专业化

我遇到了一个有趣的观点,我无法解释或找到解释.考虑以下模板定义(使用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)

我无法弄清楚原因.这是一个有意识的设计决策,以避免一些我无法预见的问题?这是疏忽吗?

提前致谢.

c++ template-specialization

8
推荐指数
2
解决办法
1378
查看次数

如何在类声明之外定义 sfinae 类的成员?

在阅读了诸如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) 来编译此代码。

templates sfinae c++11

2
推荐指数
1
解决办法
660
查看次数