静态模板成员函数的显式实例化无法使用消息error C2785: 'at_Intermediate CUtil::convert_variant(const VARIANT &)' and '<Unknown>' have different return types
当我使用非静态成员函数创建相应的类时,编译器喜欢我。
// utility class - static methods
struct CUtil {
template< typename at_Intermediate > static at_Intermediate convert_variant( const VARIANT &v ) ;
template<> static VARIANT convert_variant<VARIANT >( const VARIANT &v ) { return v; } //
template<> static double convert_variant<double >( const VARIANT &v ) { return v.dblVal; }
template<> static long convert_variant<long >( const VARIANT &v ) { return v.lVal ; }
template<> static BSTR convert_variant<BSTR >( const VARIANT &v ) { return v.bstrVal; }
};
这是一个有问题的问题:
为什么编译器在显然知道某个函数“Unknown”时会抱怨它?
触发此消息的原因 - 当函数全局或非静态时它会消失。
编辑:
在Josh的一些有用提示之后:是否不允许在类声明中显式实例化模板函数?
答案 0 :(得分:2)
以这种方式尝试:
struct CUtil {
template< typename T >
static T convert_variant(const VARIANT &);
};
template<> int CUtil::convert_variant<int>(const VARIANT &);
template<> VARIANT CUtil::convert_variant<VARIANT>(const VARIANT &);
您无法在类范围内明确专门化模板。 See here
VS2008的奇怪问题是它确实有效。
struct CUtil {
template< typename T >
static T convert_variant(const VARIANT &);
template<>
static int convert_variant<int>(const VARIANT &);
};
而且:
struct CUtil {
template< typename T > static void convert_variant(T);
template<> static void convert_variant<VARIANT >(VARIANT);
};
答案 1 :(得分:2)
显然你可能只在命名空间范围内使用显式模板专业化,虽然我在标准中找不到这个(但是GCC说的很多)。以下适用于我(在海湾合作委员会):
struct CUtil {
template< typename at_Intermediate > static at_Intermediate convert_variant( const VARIANT &v ) ;
};
template<> VARIANT CUtil::convert_variant<VARIANT >( const VARIANT &v ) { return v; }
template<> double CUtil::convert_variant<double >( const VARIANT &v ) { return v.dblVal; }
template<> long CUtil::convert_variant<long >( const VARIANT &v ) { return v.lVal ; }
template<> BSTR CUtil::convert_variant<BSTR >( const VARIANT &v ) { return v.bstrVal; }
编辑标准中 :
14.7.2.5:
类或函数模板特化的显式实例化放置在定义模板的命名空间中。类模板成员的显式实例化放置在定义封闭类的命名空间中。 成员模板的显式实例化放置在定义封闭类或类模板的命名空间中。
(我强调所有重点。)