Cha*_*l72 10 c++ gcc templates g++ c++11
作为更大程序的traits类的一部分,我尝试创建一个静态类变量,该变量可以具有不同的值,具体取决于封闭类模板实例化的类型.
我已经简化了相关的代码,以生成我正在谈论的一个简单的例子:
#include <iostream>
#include <string>
#include <type_traits>
template <class T, class Enable = void>
struct Foo;
template <class T>
struct Foo<T,
typename std::enable_if<std::is_integral<T>::value>::type
>
{
static std::string message;
};
template <class T>
struct Foo<T,
typename std::enable_if<std::is_floating_point<T>::value>::type
>
{
static std::string message;
};
template <class T, class Enable>
std::string Foo<T, Enable>::message;
Run Code Online (Sandbox Code Playgroud)
使用GCC 4.6,这会产生编译器错误:template definition of non-template ‘std::string Foo<T, Enable>::message.出现问题是因为最后两行,我只是定义静态变量std::string Foo<T, Enable>::message.
我很困惑为什么会这样.如果我省略最后两行(但当然会导致链接器错误),编译器错误就消失了.这是GCC的编译器错误吗?
Vau*_*ato 10
这仅在模板参数与部分特化匹配时有效:
template <class T>
std::string Foo<T,
typename std::enable_if<std::is_integral<T>::value>::type
>::message;
template <class T>
std::string Foo<T,
typename std::enable_if<std::is_floating_point<T>::value>::type
>::message;
Run Code Online (Sandbox Code Playgroud)
这在C++ 03标准的14.5.4.3节中规定.我们的想法是,部分特化是一个新模板,外部定义的成员的模板参数必须与类定义的模板参数匹配,以便它知道成员使用哪个模板.
在您的示例中,规则避免为非整数或浮点类型定义消息成员.
| 归档时间: |
|
| 查看次数: |
1332 次 |
| 最近记录: |