4

以下のコード (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> ]
4

1 に答える 1