2015-07-25 4 views
2

Вот мой код:Инициализация статической переменной константный дает мне шаблон определения нешаблонном сопзЬ

#include <iostream> 
class c{ 
    public: 
    int y; 
    c(int x,int p):y(x){ 
    std::cout<<"has been made"<<std::endl; 
    } 


}; 



template<int x,typename B = void> 
struct checkeven{ 

}; 


template<typename B> 
struct checkeven<0,B>{ 
    typedef B type; 
}; 



template<int x,int y,class = typename checkeven<x%2,int>::type> 
struct t{ 
    static const c tee; 

    static const inline c& initor(){ 

    return tee; 
    } 
}; 

template<int x,int y> 
const c t<x,y>::tee(x,y);  //how do i initialize? 


int main(int argc, char** argv) { 

//t<2,1>::initor();  
//t<2,2>::initor(); 

    return 0; 
} 

Я попытался исследовать это о, но я не могу найти ничего, кроме внушения, чтобы удалить значение по умолчанию дублировать , Я хочу реализовать SFINAE, чтобы убедиться, что первое значение является четным числом. У меня есть статическая константная переменная, которую я хочу инициализировать. Он отлично работал без моего класса по умолчанию, но как только я добавил его, все стало беспорядочным. Как инициализировать мой константный статический член? Я также хотел бы знать, почему мой код не работает.

ответ

3

Вы должны специализироваться ваш шаблон-структуру t так:

template<int x, int y> 
struct t<x,y, typename checkeven<x%2,int>::type> 
{ 
    static const c tee; 

    static const inline c& initor(){ 

     return tee; 
    } 
}; 

Используя это, вы будете иметь возможность инициализировать переменную тройник так:

template<int x, int y> 
const c t<x, y>::tee(x, y); 

Живой пример here

+0

Это работает спасибо, но зачем мне это нужно? –

+0

@CarloBrew Я попробовал это по инстинкту, я ищу причину в стандарте, я отредактирую свой пост, как только у меня будет веская причина. – Pumkko

+0

Хорошо, спасибо. –

Смежные вопросы