ошибка C ++ C3200 - PullRequest
       32

ошибка C ++ C3200

0 голосов
/ 20 октября 2010

Я борюсь с ошибкой компиляции C3200

http://msdn.microsoft.com/en-us/library/3xwxftta.aspx обсуждает проблему и приводит в качестве примера:

// C3200.cpp
template<typename T>
class X
{
};

template<template<typename U> class T1, typename T2>
class Y
{
};

int main()
{
   Y<int, int> y;   // C3200
}

и предлагает вместо этого

Y<X, int> y; 

должен быть использован.но я не очень понимаю это ... почему это не может быть

Y<X<int>, int> y;

?это будет иметь для меня больше смысла, потому что в предлагаемом способе фактический тип y все еще не определен на самом деле .. если я дополню данный пример некоторыми переменными, я получу это:

// C3200.cpp
template<typename T>
class X
{
    char someChar;
    T someOtherVar;
};

template<template<typename U> class T1, typename T2>
class Y
{
    T1 var1;
    T2 var2;
};

, так что если я простоуказать Y y;как и в предлагаемом решении, компилятор все еще не знает, сколько байтов зарезервировано для y - нет?

может кто-нибудь объяснить мне, что происходит?

спасибо!

Ответы [ 3 ]

2 голосов
/ 20 октября 2010

C3200 жалуется, что первый «int» в «Y»шаблон "не может быть принужден к совпадению"класс T1 ", потому что этот тип int не является типом шаблона. Это единственная проблема, возникающая в C3200. Однако" X "также может быть неправильным, потому что это будет тип без шаблона.тип, а не «полностью разрешенный» тип.

1 голос
/ 20 октября 2010
template<template<typename U> class T1, typename T2>

Здесь T1 - это так называемый « параметр шаблона шаблона ». Это означает, что он должен принять шаблон. X - это шаблон, X<int> создается в классе.

template<template<typename U> class T1, typename T2>
class Y
{
    T1 var1;
    T2 var2;
};

Это не компилируется, потому что T1 - это шаблон, а не тип. Чтобы сделать T1 типом, вам нужно передать ему параметр, например

template<template<typename U> class T1, typename T2>
class Y
{
    T1<T2> var1;
    T2 var2;
};
0 голосов
/ 20 октября 2010

Мое понимание проблемы заключается в том, что первый тип шаблона Y должен быть сам по себе шаблонным типом.X будет шаблонным типом, тогда как X<int> является экземпляром этого типа и не соответствует критериям для первого параметра шаблона Y.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...