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 を使用している場合でも、警告なしでこの例を正しくコンパイルします (もちろん、未使用のパラメーターを除く)
どうもありがとうございました。