template<typename T>
class CConstraint
{
public:
CConstraint()
{
}
virtual ~CConstraint()
{
}
template <typename TL>
void Verify(int position, int constraints[])
{
}
template <>
void Verify<int>(int, int[])
{
}
};
Run Code Online (Sandbox Code Playgroud)
在g ++下编译它会产生以下错误:
非命名空间范围'类CConstraint'中的显式特化
在VC中,它编译得很好.任何人都可以让我知道解决方法吗?
在最近的一次采访中,我被问到一个非常奇怪的问题.面试官问我如何使用编译器功能计算1 + 2 + 3 + ... + 1000.这意味着我不允许编写程序并执行它,但我应该编写一个程序,可以驱动编译器在编译时计算这个总和,并在编译完成时打印结果.作为提示,他告诉我,我可能会使用编译器的泛型和预处理器功能.可以使用C++,C#或Java编译器.有任何想法吗???
这个问题与计算总和无关,这里没有任何循环问题.此外,应该注意,总和应该在编译期间计算.不能使用C++编译器指令打印结果.
阅读更多关于发布的答案,我发现在使用C++模板编译期间解决问题称为元编程.这是Erwin Unruh博士在标准化C++语言过程中偶然发现的一种技术.您可以在元编程的wiki页面上阅读有关此主题的更多信息.似乎可以使用Java注释在Java中编写程序.您可以在下面看看maress的答案.
关于C++的元编程一个很好的书是这一个.如果感兴趣,值得一看.
一个有用的C++元编程库是Boost的MPL 这个链接.
考虑一下这段代码,
template<bool b>
struct other
{
static const bool value = !b;
};
template<bool b>
struct test
{
static const bool value = b || other<b>::value;
};
int main()
{
bool value = test<true>::value;
}
Run Code Online (Sandbox Code Playgroud)
编译器是否other<true>在上述情况下实例化,实例化时似乎完全没必要?或者仅仅因为我编写了语法other<b>::value,编译器必须实例化它,而不管它是否对计算值的贡献完全没有贡献test<true>::value?
我想听听,a)标准需要什么,以及b)各种编译器实际实现了什么?标准的相关部分将不胜感激.