4474


下記のような、テンプレートの明示的特殊化をしたクラスにて、静的メンバを使用したいと思っています。

[code]

    template<typename A> 
    struct Hoge{};
    
    template<>
    struct Hoge<int>{
        static int Value;
    };
    
    template<>
    int Hoge<int>::Value = 0;
    
    int main(){
        Hoge<int>::Value = 4;
    
        return 0;
    }
    
[/code]

しかし、少なくとも VisualStudio2013 においては、上記コードでは `int Hoge<int>::Value=0;`
の部分で下記のコンパイルエラーが発生します。

[code]

    error C2998: 'int Hoge<int>::Value' : テンプレート定義にはなれません。
    
[/code]

おそらく静的メンバ変数の宣言部分の書き方がまずいんだろうと思いますが、どうすればコンパイルが通るようになるのか、どなたかご教授いただけませんでしょうか？


CC BY-SA 3.0
2015-01-13T03:37:30.367
4470
2015-01-13T12:32:13.197
2015-01-13T04:04:42.627
4978
7344
question
c++ templates
特殊化されたテンプレートクラス固有の静的メンバの宣言方法

[code]

    template<>
    int Hoge<int>::Value = 0;
    
[/code]

の `template<>`
を取り除くとコンパイルできます。[英語版にほぼ同じ質問](https://stackoverflow.com/questions/5289404/initialize-
an-static-member-in-an-fully-specialized-class-template)がありました。

## 追記

`template<>` が不要な理由を追記しておきます。質問のコードの

[code]

    template<>
    struct Hoge<int>{
        static int Value;
    };
    
[/code]

は `Hoge` の `A` が int だった場合は特別にこのテンプレートの定義を使って下さいという宣言です。これがテンプレートの特殊化
(`template<>`)です。

ただし class/struct 宣言内の `static int Value;` は静的変数の存在を宣言しているだけなので、Hoge::Value を
`.cpp` (あるいは `.cc`) ファイルのどれか1つで定義しなければなりません。定義を忘れるとシンボル `Hoge<int>::Value`
が見つからないというようなエラーが出るはずです。これは `template` を使わないクラス定義の場合でも全く同じです。

そのための static 変数の定義が `int Hoge<int>::Value = 0;` です。なのでこちらはテンプレートの特殊化ではないので、
`template<>` は不要です。


CC BY-SA 3.0
2015-01-13T03:50:51.300
4474
2015-01-13T12:32:13.197
2020-06-17T08:14:45.997
-1
5575
4470
answer