473,398 Members | 2,812 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,398 software developers and data experts.

linking static template variable

// - in my xy.cpp file --

template
<const int Ttex, const int Tcol, const int Tlight, int TzBuffer>
struct MyFragmentShader
{
static const int varying_count = Ttex*2 + Tcol*3 + Tlight;
};

....
template<const int MyFragmentShader<0,1,0,1>::varying_count;
....
void foo()
{
// 'r' is of type super_complicated_class
r.fragment_shader<MyFragmentShader<0,1,0,1();
}
// -- ends

The result is:

undefined reference to `MyFragmentShader<0, 1, 0, 1>::varying_count'

I (try to) use GCC 4.0.2.

Can you please assist me?
Jan 2 '08 #1
5 1976
On 2 ÑÎ×, 19:42, "Gernot Frisch" <M...@Privacy.netwrote:
// - in my xy.cpp file --

template
<const int Ttex, const int Tcol, const int Tlight, int TzBuffer>
struct MyFragmentShader
{
šstatic const int varying_count = Ttex*2 + Tcol*3 + Tlight;

};

...
template<const int MyFragmentShader<0,1,0,1>::varying_count;
...

void foo()
{
š š// 'r' is of type super_complicated_class
š šr.fragment_shader<MyFragmentShader<0,1,0,1();}

// -- ends

The result is:

undefined reference to `MyFragmentShader<0, 1, 0, 1>::varying_count'

I (try to) use GCC 4.0.2.

Can you please assist me?
(Warning! Highly unreliable opinion!) well, you haven't defined value
of that specialized constant (if this way of template specialization
is ever correct), you only have declared it, so linker doesn't find it.
Jan 2 '08 #2
(Warning! Highly unreliable opinion!) well, you haven't defined
value
of that specialized constant (if this way of template specialization
is ever correct), you only have declared it, so linker doesn't find
it.

// code----------
template
<const int Ttex, const int Tcol, const int Tlight, int TzBuffer>
struct MyFragmentShader
{
static const int varying_count = Ttex*2 + Tcol*3 + Tlight;
};

#define VARCNT(t,c,l) template<const int
MyVertexShader<1,1,1>::attribute_count= t*2 + c*3 + l;
VARCNT(1,1,1);
VARCNT(1,1,0);
VARCNT(1,0,1);
VARCNT(1,0,0);
VARCNT(0,1,1);
VARCNT(0,1,0);
VARCNT(0,0,1);
VARCNT(0,0,0);
#undef VARCNT
// -------ends

yields:
error: duplicate initialization of MyVertexShader<1, 1,
1>::attribute_count

....I'm so, so lost here.
Jan 2 '08 #3
Gernot Frisch wrote:
>(Warning! Highly unreliable opinion!) well, you haven't defined
value
of that specialized constant (if this way of template specialization
is ever correct), you only have declared it, so linker doesn't find
it.


// code----------
template
<const int Ttex, const int Tcol, const int Tlight, int TzBuffer>
struct MyFragmentShader
{
static const int varying_count = Ttex*2 + Tcol*3 + Tlight;
};

#define VARCNT(t,c,l) template<const int
MyVertexShader<1,1,1>::attribute_count= t*2 + c*3 + l;
So, is it 'varying_count' or 'attribute_count'?
VARCNT(1,1,1);
VARCNT(1,1,0);
VARCNT(1,0,1);
VARCNT(1,0,0);
VARCNT(0,1,1);
VARCNT(0,1,0);
VARCNT(0,0,1);
VARCNT(0,0,0);
#undef VARCNT
// -------ends

yields:
error: duplicate initialization of MyVertexShader<1, 1,
1>::attribute_count

...I'm so, so lost here.
Since you have the initialisation in the declaration (in the
class template definition), you should omit any initialisation
when defining your specialisations. That's what the compiler
is telling you here.

However, going back to your original inquiry, you need to use
your static somehow to cause the _instantiation_ of the static
member. It is likely that you didn't (at least the code you
posted didn't show any *use* of varying_count'.

Perhaps you want to repost *the actual code* that exhibits the
error...

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Jan 2 '08 #4

Found it, sorry for bothering!

#define VARCNT(t,c,l) \
template<const int \
MyVertexShader<\
/* here is the bug */ \
t,c,l /* instead of 1,1,1! */ \
>::attribute_count= t*2 + c*3 + l;
and one must not define the value in the declaration, then.

template
<const int Ttex, const int Tcol, const int Tlight, int TzBuffer>
struct MyFragmentShader
{
static const int varying_count; // = Ttex*2 + Tcol*3 + Tlight;
};
Jan 2 '08 #5
On Jan 2, 4:54 pm, "Victor Bazarov" <v.Abaza...@comAcast.netwrote:
Gernot Frisch wrote:
(Warning! Highly unreliable opinion!) well, you haven't
defined value of that specialized constant (if this way of
template specialization is ever correct), you only have
declared it, so linker doesn't find it.
I think that's actually correct.
// code----------
template
<const int Ttex, const int Tcol, const int Tlight, int TzBuffer>
struct MyFragmentShader
{
static const int varying_count = Ttex*2 + Tcol*3 + Tlight;
};
#define VARCNT(t,c,l) template<const int
MyVertexShader<1,1,1>::attribute_count= t*2 + c*3 + l;
So, is it 'varying_count' or 'attribute_count'?
Different class template (MyVertexShader, instead of
MyFragmentShader), so why not a different name for the static.
I think he's just trying to confuse us by showing parts of two
different classes.

And is there an initializer or not in the explicit
specialization? That's very important, because as in the
original posting:
template<const int MyFragmentShader<0,1,0,1>::varying_count;
without the initializer, this is a *declaration* of a
specialization. And as you know, an explicit specialization is
*not* a template, per se, and obeys the usual rules of
non-template declarations. Which means that if he uses it,
there'd better be one (and only one) definition in the program.
Somewhere, in a source file (not in the header), a
template<const int
MyFragmentShader<0,1,0,1>::varying_count = something ;
VARCNT(1,1,1);
VARCNT(1,1,0);
VARCNT(1,0,1);
VARCNT(1,0,0);
VARCNT(0,1,1);
VARCNT(0,1,0);
VARCNT(0,0,1);
VARCNT(0,0,0);
#undef VARCNT
// -------ends
yields:
error: duplicate initialization of MyVertexShader<1, 1,
1>::attribute_count
...I'm so, so lost here.
What's to be lost about. You explicitely specialize
MyVertexShader<1,1,1>::attribute_count 8 times, with different
initializers.

Again, an explicit specialization behaves pretty much like a
normal declaration. You wouldn't expect something like:

int const SomeClass::foo = 1*2 + 1*3 + 1 ;
int const SomeClass::foo = 1*2 + 1*3 + 0 ;
int const SomeClass::foo = 1*2 + 0*3 + 1 ;
int const SomeClass::foo = 1*2 + 0*3 + 0 ;
int const SomeClass::foo = 0*2 + 1*3 + 1 ;
int const SomeClass::foo = 0*2 + 1*3 + 0 ;
int const SomeClass::foo = 0*2 + 0*3 + 1 ;
int const SomeClass::foo = 0*2 + 0*3 + 0 ;

to work, and what you've written is basically the same thing.

I suspect a typo in the macro, and what you meant was:
#define VARCNT(t,c,l) template<const int \
MyVertexShader<t,c,l>::attribute_count= t*2 + c*3 + l;
But beware: this still generates a *definition*, and not just a
declaration. Invoke your series of VARCNT in a header file,
include the header in more than one translation unit, and you'll
have multiple definitions (which the compiler isn't required to
diagnose).
Since you have the initialisation in the declaration (in the
class template definition), you should omit any initialisation
when defining your specialisations.
No. An explicit specialization replaces the template code. I
think he's confused you with his mixing two different classes
and two different problems in the same posting.
That's what the compiler is telling you here.
However, going back to your original inquiry, you need to use
your static somehow to cause the _instantiation_ of the static
member. It is likely that you didn't (at least the code you
posted didn't show any *use* of varying_count'.
If the static wasn't used, he wouldn't get an undefined
reference. The problem is that it is used, but he's explicitly
told the compiler not to instantiate the template variant,
becvause he's providing this one himself.
Perhaps you want to repost *the actual code* that exhibits the
error...
That would be nice. Preferrably in two separate postings, one
for each error.

--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Jan 2 '08 #6

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

4
by: Graham Dumpleton | last post by:
When you have a template class with a static member variable, ie., template<typename T> class handle { public: static void* id() { return &id_; } private: static int id_; };
7
by: Drew McCormack | last post by:
I have a C++ template class which contains a static variable whose construction registers the class with a map. Something like this: template <typename T> class M { static Registrar<M>...
16
by: Eric | last post by:
I have a static class member variable as follows: struct A { static void Set (int i) { v = i; } static int& Get () { return v; } static int v; }; int A::v; // define A::v in the cpp file
7
by: ank | last post by:
Hi, I was curious about how to define static data member of template class. Should I put the definition in a separate source file or in the same header file as its template class? And when this...
4
by: santosh | last post by:
Hello, I have a doubt about static variable. class B { private: static int x; public: static set(int y) {
15
by: Improving | last post by:
I have a template class that has static members, so in the .cpp file I have defined them with templated definitions. Now when in a different ..cpp file that includes the header file for the...
3
by: Diebels | last post by:
Hi, I have some problems using static variables which results in a core dump. I have attached code and coredump to the end of my message. I am trying to implement a kind of factory design. I...
5
by: ciccio | last post by:
Hi, I have a problem with my code that the compiler does not find any inline functions which are static. The simple code example is written below, this is what the compiler throws at me. ]...
4
by: aaragon | last post by:
Hi everyone, I have a linking error when using gcc4.2 and static member variables. The class template definition is something around the following: template<> class Element<L2_t: public...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.