Rashmistrz Temat założony przez niniejszego użytkownika |
undefined reference to ' [...] ' » 2016-03-28 19:01:39 Według mnie wszystko jest dobrze... tylko linker coś wywala: ||=== Build file: "no target" in "no project" (compiler: unknown) ===| E:\CACHE\011\XOXOXO\main.o:main.cpp|| undefined reference to `bitcounter::belongs_to'| E:\CACHE\011\XOXOXO\main.o:main.cpp|| undefined reference to `bitcounter::belongs_to'| ||error: ld returned 1 exit status| ||=== Build failed: 3 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|
class bitcounter { constexpr static const BYTE ptr[ 33 ] = { 3, 0, 3, 6, 2, 0, 4, 3, 0, 5, 7, 2, 1, 3, 4, 1, 4, 6, 7, 2, 1, 5, 3, 2, 3, 7, 2, 2, 4, 3, 2, 5, 6 }; constexpr static const BYTE * belongs_to[ 9 ] = { ptr + 0, ptr + 4, ptr + 7, ptr + 11, ptr + 14, ptr + 19, ptr + 22, ptr + 26, ptr + 29 }; BYTE linie = 0; WORD liczniki = 0xFFFF; inline void increment( BYTE ); public: BYTE update( BYTE ); };
BYTE bitcounter::update( BYTE field ) { BYTE copy = linie; const BYTE * field_blelongs_to = belongs_to[ --field ]; for( BYTE n = field_blelongs_to[ 0 ]; n; n-- ) increment( belongs_to[ field ][ n ] ); return copy ^ linie; }
inline void bitcounter::increment( BYTE counter ) { counter << 1; if( liczniki &( 1 << counter ) ) liczniki &= ~WORD( 1 << counter ); else if( liczniki &( 1 <<( counter + 1 ) ) ) liczniki &= ~WORD( 1 << counter ); else linie |= counter >> 1; }
|
|
michal11 |
» 2016-03-28 22:23:15 Za mało kodu, po błędzie wnioskuję, że w main chcesz ale odwołać do prywatnej zmiennej (belongs_to) |
|
Rashmistrz Temat założony przez niniejszego użytkownika |
» 2016-03-28 22:53:40 W main.cpp nigdzie nie odwołuję się do belongs_to, tylko w załączonym kodzie... a błąd występuję podczas konsolidacji. Myślę, że to przez jakieś optymalizacje wykonane przez kompilator. :F |
|
mokrowski |
» 2016-03-28 23:14:22 (żart) Jakby tak z całej tej zabawy wykluczyć ten "głupi kompilator". Od razu było by mniej błędów :-) (/żart)
A poważniej.. Popatrz do błędu. Kompilator jednak twierdzi że się odwołujesz :-/ |
|
Rashmistrz Temat założony przez niniejszego użytkownika |
» 2016-03-28 23:33:01 Kompilator jednak twierdzi że się odwołujesz :-/ |
Linker... to są błędy linkera... Zamieniłem te wszystkie "dziwne" dane na globalne i od razu przestał krzyczeć. Mi tam to nie zaszkodzi... |
|
Elaine |
» 2016-03-29 09:28:24 Jeśli statyczna składowa klasy jest ODR-użyta, a nie posiada definicji, to zachowanie jest niezdefiniowane. Rozwiązanie: zdefiniować stałe: constexpr const BYTE bitcounter::ptr; constexpr const BYTE * bitcounter::belongs_to; |
|
Rashmistrz Temat założony przez niniejszego użytkownika |
» 2016-03-29 19:50:51 Co to znaczy? To co napisałem to już jest definicją. Tak? constexpr static const BYTE ptr[ 33 ] = { 3, 0, 3, 6, 2, 0, 4, 3, 0, 5, 7, 2, 1, 3, 4, 1, 4, 6, 7, 2, 1, 5, 3, 2, 3, 7, 2, 2, 4, 3, 2, 5, 6 }; constexpr static const BYTE * belongs_to[ 9 ] = { ptr + 0, ptr + 4, ptr + 7, ptr + 11, ptr + 14, ptr + 19, ptr + 22, ptr + 26, ptr + 29 }; Rozwiązanie: zdefiniować stałe: |
Ale one już są stałe. :O Stałe statyczne... Może coś nie tak jest w tym że są właśnie statyczne? |
|
Elaine |
» 2016-03-29 20:50:07 To co napisałem to już jest definicją. Tak? |
Nie. 9.4.2/2: The declaration of a static data member in its class definition is not a definition […]. The definition for a static data member shall appear in a namespace scope enclosing the member’s class definition. |
oraz 9.4.2/3: A static data member of literal type can be declared in the class definition with the constexpr specifier; if so, its declaration shall specify a brace-or-equal-initializer in which every initializer-clause that is an assignment-expression is a constant expression. […] The member shall still be defined in a namespace scope if it is odr-used (3.2) in the program and the namespace scope definition shall not contain an initializer. |
Dlatego potrzebujesz takich definicji, jakie podałem wyżej. |
|
« 1 » 2 |