English 中文(简体)
带有 VARIANT 返回类型的模板实例化
原标题:
  • 时间:2009-01-08 19:38:33
  •  标签:

静态模板成员函数的显式实例化一直编译失败,提示信息为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; }
};

这是一个复合问题:

  1. 为什么编译器会抱怨一个函数名“未知”,明明已知道了?

  2. 什么触发了这个消息 - 当函数变为全局或非静态时,它会消失。

编辑:

在 Josh 给出了一些有用的提示后:在类声明中不允许显式实例化模板函数吗?

最佳回答

显然,你只能在命名空间作用域中使用显式模板特化,尽管我在标准中找不到这个规定(但GCC说了)。以下内容对我有效(在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; }

EDIT 它是标准中的一部分:

十四·七·二·五

一个类或函数模板具体实例化的声明被放置于该模板所定义的命名空间中。一个类模板成员的具体实例化被放置于该类所在的命名空间中。一个成员模板的具体实例化被放置于所在类或类模板所定义的命名空间中。

所有强调皆由我添加。

问题回答

试一试这个方法:

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 &);

您不能在类作用域内明确特化一个模板。请参见这里

关于VS2008的奇怪问题是,这确实有效。

struct CUtil {
    template< typename T > 
    static T convert_variant(const VARIANT &);
    template<> 
    static int convert_variant<int>(const VARIANT &);
};

And this: 这个

struct CUtil {
    template< typename T > static void convert_variant(T);
    template<> static void convert_variant<VARIANT >(VARIANT);
};




相关问题
热门标签