5

ファイルalpha.hがあるとします:

class Alpha {
public:
    template<typename T> void foo();
};

template<> void Alpha::foo<int>() {}
template<> void Alpha::foo<float>() {}

複数の cpp ファイルに alpha.h をインクルードし、GCC 4.4 でコンパイルすると、複数のオブジェクト ファイルfoo<int>にまたがる複数の定義があるとエラーが表示されます。foo<float>私には理にかなっているので、最後の 2 行を次のように変更します。

template<> extern void Alpha::foo<int>() {}
template<> extern void Alpha::foo<float>() {}

しかし、GCCは次のように述べています。

明示的なテンプレートの特殊化は、ストレージ クラスを持つことはできません

わかりました...どうすればこれを正しく行うことができますか? そもそも私がやろうとしていることを C++ が許可していないのではないかと心配しています。その場合、同じことを達成する良いイディオムはありますか?

4

4 に答える 4

10

インラインキーワードを使用する

template<> inline void Alpha::foo<int>() {}

または、別のcppファイルで実装を提供します

于 2010-07-16T16:17:32.140 に答える
6

インライン オプションと同様に前方宣言できます。

// .h
template<> void Alpha::foo<int>();

//.cpp
template<> void Alpha::foo<int>() {}
于 2010-07-16T16:44:29.127 に答える
4

ODR の観点からは、完全に (明示的に) 特殊化されたテンプレートはもはやテンプレートではないため、同じ種類の非テンプレート エンティティと同じ ODR 原則に従います。(その規則にはいくつかの例外があると思いますが、私たちの目的には十分です)。

あなたの場合、ODR の目的では、完全に特殊化された関数テンプレートは通常の関数です。そのため、通常の関数としてヘッダー ファイルで宣言し、 1 つの実装ファイルで定義する必要があります。

于 2010-07-16T17:00:50.773 に答える
-1

個別の宣言やインライン キーワークは必要ありません。作業コードの下の PF。

#include<iostream>

class temp
{
public:
    template <class T>
    T add1(T a, T b)
    {
            return (a + b);
    }
};

template<>
std::string temp::add1<std::string>(std::string aa, std::string bb)
{
    return aa+bb;
}

int main()
{
    temp *tc = new temp();
    std::cout << tc->add1<float>(5.7, 4.5) << std::endl;
    std::cout << tc->add1<std::string>("my ","program") << std::endl;
}

出力は次のとおりです。

10.2

私のプログラム

于 2016-01-05T12:23:52.253 に答える