下面的代码(它用clang和gcc编译得很好)。问题是这段代码违反了 C++03 标准,还是 VS 2005 的错误?如果这是错误,有什么解决方法吗?
更新:我通过使用前向声明找到了解决方法:
//forward declaration
template<typename T, bool IsAcceptedType = Filter::template Acceptor<T>::IsAccepted>
struct FilteredConstructor;
//implementation
template<typename T>
class FilteredConstructor<T, true> {/*code here*/};
但是关于有效或无效的此类代码是否符合标准的问题仍然存在
namespace {
struct CoreTypesFilter {
template<typename T> struct Acceptor {
static const bool IsAccepted = false;
};
};
}
template<class Filter>
class QVariantConstructor {
template<typename T, bool IsAcceptedType = Filter::template Acceptor<T>::IsAccepted>
struct FilteredConstructor {
FilteredConstructor(const QVariantConstructor &tc) {}
};
template<typename T>
struct FilteredConstructor<T, /* IsAcceptedType = */ false> {
FilteredConstructor(const QVariantConstructor &tc) {}
};
public:
template<typename T>
void delegate(const T*)
{
FilteredConstructor<T> tmp(*this);
}
};
//comment or uncomment them to build on VS or linux
#define _TCHAR char
#define _tmain main
int _tmain(int argc, _TCHAR* argv[])
{
QVariantConstructor<CoreTypesFilter> vc;
vc.delegate("test");//this line trigger compile error
return 0;
}
来自 VS 2005 编译器的编译错误:
错误 C2976:“QVariantConstructor::FilteredConstructor”:模板参数太少 1> 与 1> [ 1> 过滤器=`匿名命名空间'::CoreTypesFilter 1>] 1> 参见 'QVariantConstructor::FilteredConstructor' 的声明 1> 与 1> [ 1> 过滤器=`匿名命名空间'::CoreTypesFilter 1>] 1> 参见正在编译的函数模板实例化 'void QVariantConstructor::delegate(const T *)' 的参考 1> 与 1> [ 1> 过滤器=`匿名命名空间'::CoreTypesFilter, 1> T=字符 1>] 1> 错误 C2514: 'QVariantConstructor::FilteredConstructor' : 类没有构造函数 1> 与 1> [ 1> 过滤器=`匿名命名空间'::CoreTypesFilter 1>] 1> 参见 'QVariantConstructor::FilteredConstructor' 的声明 1> 与 1> [ 1> 过滤器=`匿名命名空间'::CoreTypesFilter 1>]