компилируется: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++; и даже дольше, так как я использовал шаблоны. Я знаю, что это может быть странный способ использования шаблонов, но я могу заверить вас, что у меня есть веская причина!
Там причина для вас нуждаясь 1500 респ. У нас нет тега для каждого кода ошибки компилятора MSVC. – chris
И ваш класс имеет два параметра шаблона, но ваше определение функции для класса с одним. – chris
Да .. Я это понимаю. Но у меня есть два объявления для шаблона Foo. Один из них имеет два параметра шаблона, другой - только один. Первый фрагмент кода создает экземпляр второго класса шаблонов (как и ожидалось), который я пытался сделать. Мне просто интересно, как я могу отделить декларацию и определение =/ –