当我尝试调用Foo<T>::setValue
涉及多个模板参数的成员函数版本时,有人会告诉我为什么编译器会标记错误,如下所示。
class Bar
{
public:
enum TYPE{};
};
//////////////////////////////////////////////////////////////////////////////////////
template<typename T>
class Foo
{
public:
template<typename P>
void setValue1();
template<typename P, int>
void setValue2();
template<typename P, typename P::TYPE>
void setValue3();
private:
T m_value;
};
//////////////////////////////////////////////////////////////////////////////////////
template<typename T>
template<typename P>
void Foo<T>::setValue1()
{
}
template<typename T>
template<typename P, int>
void Foo<T>::setValue2()
{
}
template<typename T>
template<typename P, typename P::TYPE>
void Foo<T>::setValue3()
{
}
//////////////////////////////////////////////////////////////////////////////////////
int main()
{
Foo<Bar::TYPE> f1;
f1.setValue1<Bar>(); // Compiles
f1.setValue2<Bar, int>(); // ERROR
f1.setValue3<Bar, Bar::TYPE>(); // ERROR
return EXIT_SUCCESS;
}
海合会错误:
error: no matching function for call to ‘Foo<Bar::TYPE>::setValue2()’
error: no matching function for call to ‘Foo<Bar::TYPE>::setValue3()’
MSVC .NET 2008 错误:
Test6.cpp(60) : error C2975: 'Foo<T>::setValue2' : invalid template argument for 'unnamed-parameter', expected compile-time constant expression
with
[
T=Bar::TYPE
]
Test6.cpp(24) : see declaration of 'Foo<T>::setValue2'
with
[
T=Bar::TYPE
]
Test6.cpp(61) : error C2975: 'Foo<T>::setValue3' : invalid template argument for 'unnamed-parameter', expected compile-time constant expression
with
[
T=Bar::TYPE
]
Test6.cpp(27) : see declaration of 'Foo<T>::setValue3'
with
[
T=Bar::TYPE
]