2

次のコードは正しくコンパイルされます。

#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: 'Container::doSomething': 明示的に特殊化することはできません c:\users\bharani\documents\visual studio 2005\projects\templates\template specialization\templatespecializationtest.cpp 35

私はどんな間違いを犯しますか?

ありがとう。

4

1 に答える 1

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
}
于 2010-08-27T17:00:16.803 に答える