Статические данные-члены шаблонов классов - PullRequest
1 голос
/ 16 августа 2010
"A definition for a static data member may be provided in a namespace scope
 enclosing the definition of the static member's class template."

Это значит ...

Это правильно .....

namespace N{
template<typename T>class A{
public: 
   static int x;
   static int fun();
 };

}
namespace N1{
template<class T>int A<T>::x=10; }
namespace N2{template<class T>int A<T>::fun(){return 10;} }
int main(){  return 0; }

Согласно утверждению ... правильна ли моя программа ...

В противном случае ... каждый может объяснить это утверждение ... с помощью программы .... Это точка из стандарта ISO c ++. Глава 14.5.1.3, точка 1

Ответы [ 2 ]

8 голосов
/ 16 августа 2010

Если вы проверите стандарт, вы должны увидеть пример.

Определение элемента статических данных может быть предоставлено в области пространства имен, включающей определение шаблона класса статического члена.[ Пример:

template<class T> class X {
    static T s;
};
template<class T> T X<T>::s = 0;

- конечный пример ]

Ваша программа неверна, поскольку

template<class T> A<int>::x=10;
template<class T> A<int>::fun(){return 10;}

не использовал параметр шаблона T (и вы имеете в виду Ex вместо A?).Так как вы специализируете шаблон, вы должны написать

template<> int Ex<int>::x = 10;
template<> int Ex<int>::fun() { return 10; }

в пространстве имен N. (Не внутри других пространств имен, таких как N1 или N2. Он должен быть определен в том же пространстве имен, где объявлен Ex.)

0 голосов
/ 16 августа 2010

В вашем примере вы не указываете пространство имен ваших статических определений, так как закрываете его перед статическими операторами.

Кроме того, вы не даете тип возврата для определения fun ().

Это должно быть лучше:

namespace N{
template<typename T>class Ex{
public: 
    static int x;
    static int fun();
}

}
template<class T> N::Ex<T>::x=static_cast<T>(0);
template<class T> T N::Ex<T>::fun(){return static_cast<T>(10);}
int main(){  return 0; }

Предполагая, что ваш параметр шаблона T каким-то образом числовой.

UPDATE:

Исправляя несколько вещей в вашем коде, этот компилируется с помощью g ++:

namespace N{
    template<class T> class Ex{
    public:
        static T x;
        static T fun();
    };
}
template<class T> T N::Ex<T>::x=static_cast<T>(0);
template<class T> T N::Ex<T>::fun(){return static_cast<T>(10);}
int main(){  return 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...