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;
}