作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个元函数:
struct METAFUNCION
{
template<class T>
struct apply
{
typedef T type;
};
};
然后我定义一个助手:
template<class T1, class T2>
struct HELPER
{
};
然后我有第二个元函数,它派生自上面的 METAFUNCTION 并定义了应用结构的部分特化:
struct METAFUNCION2 : METAFUNCION
{
template<class T1, class T2>
struct apply<HELPER<T1, T2> > : METAFUNCION::apply<T2>
{
};
};
到目前为止,一切顺利 - 代码在 g++ 4.3.2 下编译。所以我像下面这样使用它:
#include <typeinfo>
#include <string>
#include <cstdlib>
#include <cxxabi.h>
template<typename T>
struct type_info2
{
static std::string name()
{
char *p = abi::__cxa_demangle(typeid(T).name(), 0, 0, 0);
std::string r(p);
free(p);
return(r);
}
};
#include <boost/mpl/apply.hpp>
#include <iostream>
int main()
{
std::cout <<
type_info2<boost::mpl::apply<METAFUNCION, int>::type>::name() <<
std::endl;
std::cout <<
type_info2<boost::mpl::apply<METAFUNCION, HELPER<float, double> >::type>::name() <<
std::endl;
std::cout <<
type_info2<boost::mpl::apply<METAFUNCION2, HELPER<float, double> >::type>::name() <<
std::endl;
return(0);
}
输出:
int
double
double
如我所料,这让我有点吃惊:
int
HELPER<float, double>
double
现在,我知道像上面这样的代码不能在 Microsoft Visual C++ 2008 下编译(我不记得这条消息,但它是我无法在 METAFUNCTION2 结构中专门应用结构的内容)。
所以我的问题是 - 这种 g++ 行为是否符合标准?我有一种强烈的感觉,这里有问题,但我不是 100% 确定。
出于好奇 - 当我以这种方式重新定义 METAFUNCTION2 时,我的行为符合我的预期:
struct METAFUNCION2 : METAFUNCION
{
template<class T>
struct apply : METAFUNCION::apply<T>
{
};
template<class T1, class T2>
struct apply<HELPER<T1, T2> > : METAFUNCION::apply<T2>
{
};
};
最佳答案
所以我提交了a bug on gcc
关于c++ - 派生类中类模板的部分特化会影响基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1413158/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!