我在使用 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
我发现它很有趣,它仅在通过 Traits 类中的 typedef 使用第二个类型参数时才会失败。g++ 即使使用 -Wall -Wextra -Werror -pedantic 也能正确编译此示例而不会出现警告(当然,未使用的参数除外)
非常感谢。