如果我有以下代码:
template <typename T = int>
struct mystruct {
using doublestruct = mystruct<double>;
}
mystruct<>::doublestruct obj;
这是否会实例化mystruct<int>
模板?或者仅mystruct<double>
被实例化?
答案 0 :(得分:18)
是的,它必须实例化mystruct<int>
才能访问其成员并确定doublestruct
的含义。您可以使用static_assert
:
#include <type_traits>
template <typename T = int>
struct mystruct {
static_assert(!std::is_same<T,int>::value, "");
using doublestruct = mystruct<double>;
};
mystruct<>::doublestruct obj; // assertion fails for T==int
mystruct<char>::doublestruct obj; // OK, not instantiated for int
答案 1 :(得分:16)
是的,必须实例化; doublestruct
是实例化的成员,因此,如果您没有实例化,则没有doublestruct
。
[C++11: 14.7.1]:
除非已经显式实例化了类模板特化(14.7.2)或显式专用(14.7.3),否则在需要完全需要完全上下文的特定化中引用特化时,将隐式实例化类模板特化。 - 定义的对象类型或类类型的完整性会影响程序的语义。 [..]
特别要考虑mystruct
可能不包含成员doublestruct
的专业化的潜在影响,或者可能包含非类型成员的专业化影响。