在C ++ 03中禁止使用本地类型作为模板参数:
template<typename T>
struct Foo { };
void Make()
{
struct Unknown {};
Foo<Unknown> foo; // Bad
}
如果模板未实例化,是否有标准中有关检查此规则的指令?
是否可以确定,只有在模板实例化尝试后才检查此规则(没有实例化=&gt;编译成功)?
template<typename T>
struct Foo { };
template<typename T>
void Do(T&) { }
template<typename T>
void Do(T*) // usage with pointer is forbidden by-design
{
struct Unknown {};
Foo<Unknown>::UnknownMethod();
}
int main()
{
std::string s;
Do(s);
}
答案 0 :(得分:2)
C ++ 03中没有这样的指令,因为
如果未实例化模板,则不应该成功。
另一方面,一些编译器允许本地类型作为模板参数(例如,Visual C ++;不,它不遵循标准,但这就是生命),所以你不能用它来强制编译失败。
如果在尝试某种组合时需要编译失败,请使用标准静态断言。您可以使用Boost.Static Assert实施,评论中的implementation linked by πάντα ῥεῖ或the simple implementation in this other question/answer 1
template<typename T>
struct Foo { };
template<typename T>
void Do(T&) { }
template<typename T>
void Do(T*) // usage with pointer is forbidden by-design
{
BOOST_STATIC_ASSERT(false);
}
1 我不确定它是否正确;我认为即使没有实例化,实现也可能失败,除非参数在封闭模板中依赖于参数。