从其他专业人员那里调用专门的功能

时间:2012-11-13 07:47:45

标签: c++ templates visual-c++

我有错误

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;
}

1 个答案:

答案 0 :(得分:3)

我认为问题的原因是,在InnerFunc的代码中已经使用了特定的特化之后,您为OuterFunc定义了显式特化。

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


单独注意:函数的返回类型为const int,这不是错误的,但也非常无用(当复制返回基本数据类型时,忽略const。)