以下のコード (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> Filter=`anonymous-namespace'::CoreTypesFilter 1> ] 1> 'QVariantConstructor::FilteredConstructor' の宣言を参照してください 1>と 1> [ 1> Filter=`anonymous-namespace'::CoreTypesFilter 1> ] 1> コンパイル中の関数テンプレートのインスタンス化 'void QVariantConstructor::delegate(const T *)' への参照を参照してください 1>と 1> [ 1> Filter=`anonymous-namespace'::CoreTypesFilter, 1> T=文字 1> ] 1> エラー C2514: 'QVariantConstructor::FilteredConstructor': クラスにコンストラクターがありません 1>と 1> [ 1> Filter=`anonymous-namespace'::CoreTypesFilter 1> ] 1> 'QVariantConstructor::FilteredConstructor' の宣言を参照してください 1>と 1> [ 1> Filter=`anonymous-namespace'::CoreTypesFilter 1> ]