3

msvc-2010 を使用してテンプレートをコンパイルする際に問題があります。gcc 4.6.3 を使用して完全に動作します。

私はコードを本質的に煮詰めました(もちろん意味がありません):

//Variant that works
template <typename T, T* Ptr>
void callFun()
{
}

//Traits class (type expands to the same type T* as above)
template <typename T>
class TraitsClass
{
public:
    typedef T* type;
};

//Essentially the same as callFun2, only that the
//type of Ptr is expressed indirectly over a traits class
//The usage of this class is not possible, because of the error described below
template <typename T, typename TraitsClass<T>::type Ptr>
void callFun2()
{
}

//Provides a compile constant ptr for this example
void testFun()
{
}

int main()
{
    //Works
    callFun<void(), &testFun>();

    //Fails
    callFun2<void(), &testFun>();

    //Works
    callFun2<void(), 0>();

    return 0;
}

エラー:

error C2975: 'Ptr' : invalid template argument for 'callFun2', expected compile-time constant expression

興味深いことに、2 番目の型パラメーターが Traits クラスの typedef を介して使用されている場合にのみ失敗します。g++ は、 -Wall -Wextra -Werror -pedantic を使用している場合でも、警告なしでこの例を正しくコンパイルします (もちろん、未使用のパラメーターを除く)

どうもありがとうございました。

4

1 に答える 1

2

答えは、コンパイラは神によって書かれたものではないということだと思います。コンパイラ業界のプログラミング標準は非常に高く、MS C++ は優れたコンパイラですが、依然としてバグが含まれています。私は次のことに出くわしました。それはあなたが指摘しているものと何らかの形で似ています:

template <class item_struct>
struct THeapBasedArray
{
    void  Sort(int (__cdecl *compareFunction)(const item_struct *item1,
                                              const item_struct *item2));
};

struct Item { int x; };

struct ItemPtrsArray : public THeapBasedArray<Item*>
{
    static int __cdecl  Compare1(const Item **pp1, const Item **pp2);

    typedef Item *ItemPtr;
    static int __cdecl  Compare2(const ItemPtr *pp1, const ItemPtr *pp2);
};

int main()
{
    ItemPtrsArray vect;

    vect.Sort(ItemPtrsArray::Compare1);
    vect.Sort(ItemPtrsArray::Compare2);
}

Sort の最初の呼び出しは次のエラーで失敗します。

cpptest1.cxx(21): エラー C2664: 'THeapBasedArray::Sort': パラメーター 1 を 'int (_ cdecl *)(const Item **, const Item **)' から 'int ( _cdecl *)(const item_struct *, const item_struct *)

2番目の呼び出しコンパイラは問題ありません。私にとって、これはコンパイラのバグです。時々これが起こります。これが答えだと思います。

于 2012-06-20T21:48:32.787 に答える