2013-07-07 2 views
0

компилируется:C++ шаблон C2039

template <class T> 
class Bar {}; 

template<class T, class Dummy=void> 
class Foo; 

template<class T> 
class Foo <T, typename std::enable_if< 
    std::is_base_of<Bar<T>, T>::value 
>::type> { 
    public: 
     //THIS CHANGES IN THE 2ND SNIPPET 
     void test() const { 
      std::cout << "test"; 
     } 
}; 

class Cat : Bar<Cat> {}; 

int main() { 
    Foo<Cat> foo; 
    foo.test(); 
    return 0; 
} 

Это ошибки:

template <class T> 
class Bar {}; 

template<class T, class Dummy=void> 
class Foo; 

template<class T> 
class Foo <T, typename std::enable_if< 
    std::is_base_of<Bar<T>, T>::value 
>::type> { 
    public: 
     //THIS CHANGED! 
     void test() const; 
}; 

//THIS WAS ADDED SINCE THE 1ST SNIPPET! 
template<class T> 
void Foo<T>::test() const { 
    std::cout << "test"; 
} //error C2039: 'test' : is not a member of 'Foo<T>' 

class Cat : Bar<Cat> {}; 

int main() { 
    Foo<Cat> foo; 
    foo.test(); 
    return 0; 
} 

я отметил различия. Почему это ошибка во втором фрагменте кода? Как сохранить декларацию и определение отдельно, избегая ошибки?

Я предполагаю, что это что-то делать с этим получили: «шаблон недействительными Foo :: тест() сопзЬ»

Мол, это неправильный способ, чтобы сообщить компилятору, что метод испытания () Const является методом шаблона класса шаблона класса Foo, T> :: значения> :: типа>

Я, конечно, посмотрел его на Google и StackOverflow, но мне кажется, что всякий раз, когда эта ошибка появляется для шаблонов, это разная причина каждый раз. (Возможно, потому, что многое может вызвать ошибку C2039.)

Также, мод. или кто-то поможет мне добавить C2039 тег для этого сообщения? Он говорит, что мне нужен минимум. 1500 реп. для добавления этого тега.

- Rambling - Следует также отметить, что прошло некоторое время с тех пор, как я использовал C++; и даже дольше, так как я использовал шаблоны. Я знаю, что это может быть странный способ использования шаблонов, но я могу заверить вас, что у меня есть веская причина!

+2

Там причина для вас нуждаясь 1500 респ. У нас нет тега для каждого кода ошибки компилятора MSVC. – chris

+0

И ваш класс имеет два параметра шаблона, но ваше определение функции для класса с одним. – chris

+0

Да .. Я это понимаю. Но у меня есть два объявления для шаблона Foo. Один из них имеет два параметра шаблона, другой - только один. Первый фрагмент кода создает экземпляр второго класса шаблонов (как и ожидалось), который я пытался сделать. Мне просто интересно, как я могу отделить декларацию и определение =/ –

ответ

1

Пример объявления члена вне класса для частично специализированного шаблона класса приведен в 14.5.4.3/1 (C++ 03). И это то, что он выглядит как

// primary template 
template<class T, int I> struct A { 
    void f(); 
}; 

// class template partial specialization 
template<class T> struct A<T,2> { 
    void g(); 
}; 

// member of class template partial specialization 
template<class T> void A<T,2>::g() { } 

Как вы можете видеть, вы должны указать специальные аргументы в определении члена вне-класса.

В вашем случае это должно быть

template<class T> 
void Foo<T, typename std::enable_if< 
    std::is_base_of<Bar<T>, T>::value>::type>::test() const { 
    std::cout << "test"; 
}