0
I have the following:

class obj
{

    template<typename T>
    inline int foo(T val) const;
};


template<typename T>
int obj::foo(T val)  const
{
    //Do something for PODs
}

template<>
int obj::foo<std::vector<bool>::reference>(std::vector<bool>::reference val) const
{
    //Do something for a boolean in vector of booleans.
}

template<>
int obj::foo<std::string>(std::string var) const
{
    //Do something for string. 
}

FreeBSD 用に g++ でコンパイルすると、コンパイラは次のように文句を言います。

In function int obj::foo<std::_Bit_reference>(std::_Bit_reference) const': /path/to/file.h:22: multiple definition of int obj::foo<std::_Bit_reference>(std::_Bit_reference) const' /path/to/file.h:22 first defined here

std::string についても同じです。

In function int obj::foo<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const': などなど

ここで何が問題なのかわかりません。誰かがこれで私を助けてくれますか?

4

2 に答える 2

1

それらの:

template<>
int obj::foo<std::vector<bool>::reference>(std::vector<bool>::reference val) const
{
    //Do something for a boolean in vector of booleans.
}

template<>
int obj::foo<std::string>(std::string var) const
{
    //Do something for string. 
}

特殊化であるため、ヘッダーではなく.cppにある必要がある関数定義です(ただし、ヘッダーに宣言を保持します)。それらをヘッダーに含めると、ヘッダーを含む各 .cpp に 1 つの定義を持つことになります。

于 2013-06-25T11:38:46.987 に答える
1

末尾のセミコロンを取り除くint obj::foo(T val) const;

于 2013-06-25T11:27:49.013 に答える