Как я могу инициализировать статическую константную строку шаблона для каждого типа класса, который создает шаблонный класс? - PullRequest
0 голосов
/ 16 ноября 2018

Мой (неработающий) код:

// hpp file
#include <iostream>
#include <string>

class iHello {
  public: virtual void hello(void) = 0;
};

template<typename T> class foo : public iHello {
  public: void hello(void) { std::cout << "Say hello :" << key << std::endl; }
  private:
    static const std::string key;
};

template<typename T> const std::string foo<T>::key = "all foo<T>";

// cpp file
class boo: public foo<boo> { };

class bar: public foo<bar> { };
template<typename T> const std::string foo<bar>::key = "bar"; // error

class baz: public foo<baz> { };
template<typename T> const std::string foo<baz>::key = "baz"; // error

int main(int argc, char ** argv) {
    boo a;
    bar b;
    baz c;

    a.hello();
    b.hello();
    c.hello();

    return 0;
}

Мой желаемый результат будет:

Say hello :all foo<T>
Say hello :bar
Say hello :baz

Но я не могу понять, как инициализировать член статической константы keyоснованный на шаблонном классе.

Если я не могу сделать оба (общий и конкретный случаи), то я предпочитаю, чтобы мне пришлось явно определять key для каждого созданного шаблонного класса.

Есть ли способсделать это?

1 Ответ

0 голосов
/ 16 ноября 2018

Правильный синтаксис для полной специализации статических членов в определении должен быть:

template<> const std::string foo<bar>::key = "bar";
template<> const std::string foo<baz>::key = "baz";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...