模板专业化:非内联函数定义问题

时间:2010-08-27 16:57:15

标签: c++ templates template-specialization

以下代码正确编译。

#include <string>

template <typename T, typename U>
class Container
{
private:
    T value1;
    U value2;
public:
    Container(){}
    void doSomething(T val1, U val2);
};

template<typename T, typename U>
void Container<typename T, typename U>::doSomething(T val1, U val2)
{
    ; // Some implementation
}

template <>
class Container<char, std::string>
{
private:
    char value1;
    std::string value2;
public:
    Container(){}
    void doSomething(char val1, std::string val2)
    {
        ; // Some other implementation
    }
};

但如果我尝试在外面定义void doSomething(char val1, std::string val2),我会收到以下错误。

#include <string>

template <typename T, typename U>
class Container
{
private:
    T value1;
    U value2;
public:
    Container(){}
    void doSomething(T val1, U val2);
};

template<typename T, typename U>
void Container<typename T, typename U>::doSomething(T val1, U val2)
{
    ; // Some implementation
}

template <>
class Container<char, std::string>
{
private:
    char value1;
    std::string value2;
public:
    Container(){}
    void doSomething(char val1, std::string val2);
};

template<>
void Container<char,std::string>::doSomething(char val1, std::string val2)
{
    ; // Some other implementation
}

错误:

  

错误1错误C2910:   '集装箱:: DoSomething的'   :不能明确   专门的c:\ users \ bharani \ documents \ visual   工作室   2005 \项目\模板\模板   specialization \ templatespecializationtest.cpp 35

我犯了什么错误?

感谢。

1 个答案:

答案 0 :(得分:6)

您没有明确专门化成员函数。但是您正在定义显式(类模板)特化的成员函数。这是不同的,你需要定义它像

inline void Container<char,std::string>::doSomething(char val1, std::string val2)
{
    ; // Some other implementation
}

请注意,“内联”很重要,因为它不是模板,如果它是在类外部定义的,则它不是隐式内联的。如果将标头包含在多个转换单元中,则需要内联以避免重复的链接器符号。

您的显式专业化中是否有模板,必须使用您的语法:

template <>
class Container<char, std::string>
{
private:
    char value1;
    std::string value2;
public:
    Container(){}

    template<typename T, typename U>
    void doSomething(T val1, U val2) { /* primary definition */ }
};

template<>
inline void Container<char,std::string>::doSomething(char val1, std::string val2)
{
    ; // Some other implementation
}

您的第一个代码中也有错误。您需要像这样定义类外定义,而不在类模板的参数列表中使用“typename”

template<typename T, typename U>
void Container<T, U>::doSomething(T val1, U val2) 
{
    ; // Some implementation
}