4

我有一个错误

C2910: 'TEMPLATE_TEST::FuncTemplateTest::InnerFunc' : cannot be explicitly specialized, 

在编译下面的代码时。有两个模板函数,它们都是专门的。当我删除InnerFunc专用外部调用中的调用时,一切正常。那么,问题出在哪里?(我正在使用 MS VS 2008。)

class FuncTemplateTest {

public:
    template<typename T>
    const int OuterFunc(const T& key) const;

private:
    template<typename T>
    const int InnerFunc(const T& key) const;
};

template<typename T>
inline const int FuncTemplateTest::OuterFunc(const T &key) const 
{
     std::cout<<"Outer template\n";
     return InnerFunc(key);
}

template<>
inline const int FuncTemplateTest::OuterFunc<std::string>(const std::string &key) const 
{
    std::cout<<"Outer special\n" << key << '\n';
    InnerFunc(key); //remove this line to compile!!!
    return 1;
}

template<typename T>
inline const int FuncTemplateTest::InnerFunc(const T &key) const
{
     std::cout << "Inner template\nTemplate key\n";
     return 0;
}   

template<>
inline const int FuncTemplateTest::InnerFunc<std::string>(const std::string &key) const
{
    std::cout << key << '\n';
    return 1;
}
4

1 回答 1

3

我相信问题的原因是您InnerFuncOuterFunc.

如果您将 的定义移到 的定义InnerFunc之前OuterFunc,您应该没问题。(在 GCC 上,这确实解决了这个问题。)


单独说明:您的函数的返回类型是const int,这不是不正确的,但也很无用(const当基本数据类型通过复制返回时被忽略)。

于 2012-11-13T07:53:36.013 回答