Объект шаблона получает «не называет тип». - PullRequest
0 голосов
/ 18 февраля 2020

Я хочу создать класс, который содержит структуру с шаблоном. Но это дает эту ошибку, и, хотя я видел другие подобные вопросы, я не понимаю, как или если я могу объявить это таким образом, чтобы не дать этой ошибки. спасибо за вашу помощь.

# include <iostream>

using namespace std;

template <class T>
class MyTmpl {
public:
    MyTmpl() {}
    T body;
};

struct s1_t {
    std::string s;
    int x;
};

MyTmpl<s1_t> myc();
myc.body.s = "s1";
myc.body.x = 7;

int main(int argc, char** argv) {
    //std::cout << myc.body.s << ':' << myc.body.x << std::endl;
}

Это дает:

x.cpp:24:1: error: 'myc' does not name a type
    myc.body.s = "s1";
    ^

1 Ответ

0 голосов
/ 18 февраля 2020
myc.body.s = "s1";
myc.body.x = 7;

Ваша немедленная ошибка в том, что у вас есть этот код там, где не должно быть кода (на уровне файла, вне какой-либо функции). Вам нужно переместить его в main (или в другое место, которое может быть, но, вероятно, main в этом случае).

Причина, по которой вы видите does not name a type, заключается просто в том, что код в этот момент неожиданно, поэтому компилятор думает, что вы пытаетесь что-то объявить (например, int x;).

Вы получите ту же ошибку с фрагментом кода:

//using nontype = int;
nontype x;

, потому что nontype на самом деле не тип. Однако, если вы раскомментируете using (немного более современный typedef), nontype становится типом, и ошибка исчезает.


Ваша вторая проблема заключается в том, что MyTmpl<s1_t> myc(); - это объявление функции, которое станет очевидным, если вы включите его в main:

auto x = myc();

. Тогда компоновщик будет жаловаться на отсутствие определения функции myc. Вы должны изменить его на:

MyTmpl<s1_t> myc; // without the ().

Ваша третья проблема заключается в том, что, хотя вы используете язык C ++, вы еще не совсем используете мышление C ++ . Целый смысл классов состоит в том, чтобы инкапсулировать поведение и состояние, что довольно аннулируется, если все в вашем классе опубликовано c: -)

В конце концов (с опытом) вы привыкнуть как можно чаще приватизировать, предоставляя конструкторов, добытчиков, сеттеров и так далее. Не немедленная проблема для вас, но определенно что-то, к чему вы захотите поработать.


С этими изменениями (кроме «C ++ ification») и раскомментированием вашего вывода оператор, следующий результирующий код компилируется и работает нормально, производя s1:7, как ожидалось:

#include <iostream>

template <class T> class MyTmpl {
    public:

    MyTmpl() { }
    T body;
};

struct s1_t {
    std::string s;
    int x;
};

MyTmpl<s1_t> myc;  // variable, rather than function.
// code not allowed here.

int main() {
    myc.body.s = "s1";  // code allowed here.
    myc.body.x = 7;
    std::cout << myc.body.s << ':' << myc.body.x << std::endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...